From c84cd3f40e1215b67acf9055eedb0236ff0a306f Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 12:39:41 +0100 Subject: [PATCH 01/18] chore: cron updated to version 1.0.1 --- server-data/resources/[esx]/cron/LICENSE | 674 ++++++++++++++++++ server-data/resources/[esx]/cron/README.md | 38 + .../resources/[esx]/cron/fxmanifest.lua | 9 + 3 files changed, 721 insertions(+) create mode 100644 server-data/resources/[esx]/cron/LICENSE create mode 100644 server-data/resources/[esx]/cron/README.md create mode 100644 server-data/resources/[esx]/cron/fxmanifest.lua diff --git a/server-data/resources/[esx]/cron/LICENSE b/server-data/resources/[esx]/cron/LICENSE new file mode 100644 index 000000000..e3b0b61c3 --- /dev/null +++ b/server-data/resources/[esx]/cron/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + cron + Copyright (C) 2015-2023 Jérémie N'gadi + + 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: + + cron Copyright (C) 2015-2023 Jérémie N'gadi + 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/server-data/resources/[esx]/cron/README.md b/server-data/resources/[esx]/cron/README.md new file mode 100644 index 000000000..02d60cca3 --- /dev/null +++ b/server-data/resources/[esx]/cron/README.md @@ -0,0 +1,38 @@ +

cron

+

Discord + +A simple, but vital, resource that allows resources to Run tasks at specific intervals. + +# Example Usage + +```lua + +-- Execute task 5:10, every day +function CronTask(d, h, m) + print('Task done') +end + +TriggerEvent('cron:runAt', 5, 10, CronTask) + +-- Execute task every monday at 18:30 +function CronTask(d, h, m) + if d == 1 then + print('Task done') + end +end + +TriggerEvent('cron:runAt', 18, 30, CronTask) + +``` + +# Legal + +cron - run tasks at specific intervals! + +Copyright (C) 2015-2024 Jérémie N'gadi + +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 http://www.gnu.org/licenses/. diff --git a/server-data/resources/[esx]/cron/fxmanifest.lua b/server-data/resources/[esx]/cron/fxmanifest.lua new file mode 100644 index 000000000..fc4fc3cb8 --- /dev/null +++ b/server-data/resources/[esx]/cron/fxmanifest.lua @@ -0,0 +1,9 @@ +fx_version 'adamant' + +game 'gta5' +author 'bitpredator' +description 'cron' +lua54 'yes' +version '1.0.1' + +server_script 'server/main.lua' From 696b6ae608af1d3cb8b0d5eb1560d5d3a78203e4 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 12:42:49 +0100 Subject: [PATCH 02/18] Add files via upload --- .../resources/[esx]/cron/server/main.lua | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 server-data/resources/[esx]/cron/server/main.lua diff --git a/server-data/resources/[esx]/cron/server/main.lua b/server-data/resources/[esx]/cron/server/main.lua new file mode 100644 index 000000000..ab619f9bc --- /dev/null +++ b/server-data/resources/[esx]/cron/server/main.lua @@ -0,0 +1,50 @@ +local Jobs = {} +local LastTime = nil + +function RunAt(h, m, cb) + Jobs[#Jobs + 1] = { + h = h, + m = m, + cb = cb, + } +end + +function GetUnixTimestamp() + return os.time() +end + +function OnTime(time) + for i = 1, #Jobs, 1 do + local scheduledTimestamp = os.time({ + hour = Jobs[i].h, + minute = Jobs[i].m, + second = 0, -- Assuming tasks run at the start of the minute + day = os.date("%d", time), + month = os.date("%m", time), + year = os.date("%Y", time), + }) + + if time >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then + Jobs[i].cb(Jobs[i].h, Jobs[i].m) + end + end +end + +function Tick() + local time = GetUnixTimestamp() + + if not LastTime or os.date("%M", time) ~= os.date("%M", LastTime) then + OnTime(time) + LastTime = time + end + + SetTimeout(60000, Tick) +end + +LastTime = GetUnixTimestamp() + +Tick() + +AddEventHandler("cron:runAt", function(h, m, cb) + RunAt(h, m, cb) +end) From a76d175267392801bf856ecc8f125e8b5a3e71c6 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 17:59:06 +0100 Subject: [PATCH 03/18] refactor: partial rebuild for es_extended - updated to version 1.0.1 --- .../resources/[esx]/es_extended/LICENSE | 13 +- .../[esx]/es_extended/client/common.lua | 11 +- .../[esx]/es_extended/client/functions.lua | 1250 ++++----- .../[esx]/es_extended/client/main.lua | 582 ++-- .../es_extended/client/modules/actions.lua | 170 ++ .../es_extended/client/modules/callback.lua | 50 + .../[esx]/es_extended/client/modules/npwd.lua | 57 + .../[esx]/es_extended/common/functions.lua | 12 +- .../[esx]/es_extended/common/modules/math.lua | 4 +- .../es_extended/common/modules/table.lua | 19 + .../es_extended/common/modules/timeout.lua | 23 + .../[esx]/es_extended/config.logs.lua | 23 + .../resources/[esx]/es_extended/config.lua | 87 +- .../[esx]/es_extended/config.weapons.lua | 2424 ++++++++++++----- .../dependencies/cron/server/main.lua | 46 - .../dependencies/hardcap/client/main.lua | 10 - .../dependencies/hardcap/server/main.lua | 31 - .../[esx]/es_extended/es_extended.sql | 10 +- .../[esx]/es_extended/fxmanifest.lua | 38 +- .../[esx]/es_extended/html/css/app.css | 75 + .../es_extended/html/fonts/bankgothic.ttf | Bin 0 -> 36272 bytes .../[esx]/es_extended/html/fonts/pdown.ttf | Bin 0 -> 151512 bytes .../[esx]/es_extended/html/js/app.js | 40 + .../[esx]/es_extended/html/js/mustache.min.js | 347 +++ .../[esx]/es_extended/html/js/wrapper.js | 34 + .../resources/[esx]/es_extended/html/ui.html | 15 + .../resources/[esx]/es_extended/locale.js | 4 +- .../resources/[esx]/es_extended/locale.lua | 25 +- .../[esx]/es_extended/locales/cs.lua | 549 ++-- .../[esx]/es_extended/locales/de.lua | 535 ++-- .../[esx]/es_extended/locales/el.lua | 381 +++ .../[esx]/es_extended/locales/en.lua | 71 +- .../[esx]/es_extended/locales/es.lua | 81 +- .../[esx]/es_extended/locales/fi.lua | 412 +-- .../[esx]/es_extended/locales/fr.lua | 531 ++-- .../[esx]/es_extended/locales/he.lua | 375 +++ .../[esx]/es_extended/locales/hu.lua | 25 + .../[esx]/es_extended/locales/id.lua | 381 +++ .../[esx]/es_extended/locales/it.lua | 381 +++ .../[esx]/es_extended/locales/nl.lua | 219 +- .../[esx]/es_extended/locales/pl.lua | 22 + .../[esx]/es_extended/locales/sl.lua | 377 +++ .../[esx]/es_extended/locales/sr.lua | 377 +++ .../[esx]/es_extended/locales/sv.lua | 284 +- .../[esx]/es_extended/locales/zh-cn.lua | 377 +++ .../server/classes/overrides/oxinventory.lua | 26 +- .../es_extended/server/classes/player.lua | 301 +- .../[esx]/es_extended/server/commands.lua | 392 ++- .../[esx]/es_extended/server/common.lua | 79 +- .../[esx]/es_extended/server/functions.lua | 307 ++- .../[esx]/es_extended/server/main.lua | 490 ++-- .../[esx]/es_extended/server/onesync.lua | 99 +- .../[esx]/es_extended/server/paycheck.lua | 59 +- 53 files changed, 9223 insertions(+), 3308 deletions(-) create mode 100644 server-data/resources/[esx]/es_extended/client/modules/actions.lua create mode 100644 server-data/resources/[esx]/es_extended/client/modules/callback.lua create mode 100644 server-data/resources/[esx]/es_extended/client/modules/npwd.lua create mode 100644 server-data/resources/[esx]/es_extended/common/modules/timeout.lua create mode 100644 server-data/resources/[esx]/es_extended/config.logs.lua delete mode 100644 server-data/resources/[esx]/es_extended/dependencies/cron/server/main.lua delete mode 100644 server-data/resources/[esx]/es_extended/dependencies/hardcap/client/main.lua delete mode 100644 server-data/resources/[esx]/es_extended/dependencies/hardcap/server/main.lua create mode 100644 server-data/resources/[esx]/es_extended/html/css/app.css create mode 100644 server-data/resources/[esx]/es_extended/html/fonts/bankgothic.ttf create mode 100644 server-data/resources/[esx]/es_extended/html/fonts/pdown.ttf create mode 100644 server-data/resources/[esx]/es_extended/html/js/app.js create mode 100644 server-data/resources/[esx]/es_extended/html/js/mustache.min.js create mode 100644 server-data/resources/[esx]/es_extended/html/js/wrapper.js create mode 100644 server-data/resources/[esx]/es_extended/html/ui.html create mode 100644 server-data/resources/[esx]/es_extended/locales/el.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/he.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/id.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/it.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/sl.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/sr.lua create mode 100644 server-data/resources/[esx]/es_extended/locales/zh-cn.lua diff --git a/server-data/resources/[esx]/es_extended/LICENSE b/server-data/resources/[esx]/es_extended/LICENSE index 7c1b638e7..f26a06604 100644 --- a/server-data/resources/[esx]/es_extended/LICENSE +++ b/server-data/resources/[esx]/es_extended/LICENSE @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + 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. @@ -631,8 +631,7 @@ 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) 2022-2024 bitpredator + es_extended Copyright (C) 2022-2024 bitpredator 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 @@ -645,14 +644,14 @@ the "copyright" line and a pointer to where the full notice is found. 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 . + 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) 2022-2024 bitpredator + es_extended Copyright (C) 2022-2024 bitpredator 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. @@ -664,11 +663,11 @@ 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/server-data/resources/[esx]/es_extended/client/common.lua b/server-data/resources/[esx]/es_extended/client/common.lua index d6c65ca3a..11225fd22 100644 --- a/server-data/resources/[esx]/es_extended/client/common.lua +++ b/server-data/resources/[esx]/es_extended/client/common.lua @@ -2,14 +2,11 @@ exports("getSharedObject", function() return ESX end) -if GetResourceState("ox_inventory") ~= "missing" then - Config.OxInventory = true -end - -RegisterNetEvent("esx:getSharedObject", function() +AddEventHandler("esx:getSharedObject", function() + local Invoke = GetInvokingResource() print( - ("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://bitpredator.github.io/bptdevelopment/docs/esx-tutorial/sharedevent for how to fix!"):format( - GetInvokingResource + ("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://documentation.esx-framework.org/tutorials/tutorials-esx/sharedevent for how to fix!"):format( + Invoke ) ) end) diff --git a/server-data/resources/[esx]/es_extended/client/functions.lua b/server-data/resources/[esx]/es_extended/client/functions.lua index 456a35abc..bdd1f6049 100644 --- a/server-data/resources/[esx]/es_extended/client/functions.lua +++ b/server-data/resources/[esx]/es_extended/client/functions.lua @@ -2,9 +2,6 @@ ESX = {} Core = {} ESX.PlayerData = {} ESX.PlayerLoaded = false -Core.CurrentRequestId = 0 -Core.ServerCallbacks = {} -Core.TimeoutCallbacks = {} Core.Input = {} ESX.UI = {} ESX.UI.Menu = {} @@ -19,18 +16,6 @@ ESX.Scaleform.Utils = {} ESX.Streaming = {} -function ESX.SetTimeout(msec, cb) - table.insert(Core.TimeoutCallbacks, { - time = GetGameTimer() + msec, - cb = cb, - }) - return #Core.TimeoutCallbacks -end - -function ESX.ClearTimeout(i) - Core.TimeoutCallbacks[i] = nil -end - function ESX.IsPlayerLoaded() return ESX.PlayerLoaded end @@ -40,31 +25,18 @@ function ESX.GetPlayerData() end function ESX.SearchInventory(items, count) - if type(items) == "string" then - items = { items } - end - - local returnData = {} - local itemCount = #items + items = type(items) == "string" and { items } or items - for i = 1, itemCount do - local itemName = items[i] - returnData[itemName] = count and 0 - - for _, item in pairs(ESX.PlayerData.inventory) do - if item.name == itemName then - if count then - returnData[itemName] = returnData[itemName] + item.count - else - returnData[itemName] = item - end + local data = {} + for i = 1, #items do + for c = 1, #ESX.PlayerData.inventory do + if ESX.PlayerData.inventory[c].name == items[i] then + data[items[i]] = (count and ESX.PlayerData.inventory[c].count) or ESX.PlayerData.inventory[c] end end end - if next(returnData) then - return itemCount == 1 and returnData[items[1]] or returnData - end + return #items == 1 and data[items[1]] or data end function ESX.SetPlayerData(key, val) @@ -78,33 +50,35 @@ function ESX.SetPlayerData(key, val) end function ESX.Progressbar(message, length, Options) - exports["esx_progressbar"]:Progressbar(message, length, Options) + if GetResourceState("esx_progressbar") ~= "missing" then + return exports["esx_progressbar"]:Progressbar(message, length, Options) + end + + print("[^1ERROR^7] ^5ESX Progressbar^7 is Missing!") end -function ESX.ShowNotification(message, type, length) +function ESX.ShowNotification(message, notifyType, length) if GetResourceState("esx_notify") ~= "missing" then - exports["esx_notify"]:Notify(type, length, message) - else - print("[^1ERROR^7] ^5BPT Notify^7 is Missing!") + return exports["esx_notify"]:Notify(notifyType, length, message) end + + print("[^1ERROR^7] ^5ESX Notify^7 is Missing!") end -function ESX.TextUI(message, type) +function ESX.TextUI(message, notifyType) if GetResourceState("esx_textui") ~= "missing" then - exports["esx_textui"]:TextUI(message, type) - else - print("[^1ERROR^7] ^5BPT TextUI^7 is Missing!") - return + return exports["esx_textui"]:TextUI(message, notifyType) end + + print("[^1ERROR^7] ^5ESX TextUI^7 is Missing!") end function ESX.HideUI() if GetResourceState("esx_textui") ~= "missing" then - exports["esx_textui"]:HideUI() - else - print("[^1ERROR^7] ^5BPT TextUI^7 is Missing!") - return + return exports["esx_textui"]:HideUI() end + + print("[^1ERROR^7] ^5ESX TextUI^7 is Missing!") end function ESX.ShowAdvancedNotification(sender, subject, msg, textureDict, iconType, flash, saveToBrief, hudColorIndex) @@ -153,38 +127,30 @@ ESX.HashString = function(str) return input_map end -if GetResourceState("esx_context") ~= "missing" then - function ESX.OpenContext(...) - exports["esx_context"]:Open(...) - end +local contextAvailable = GetResourceState("esx_context") ~= "missing" - function ESX.PreviewContext(...) - exports["esx_context"]:Preview(...) - end - - function ESX.CloseContext(...) - exports["esx_context"]:Close(...) - end - - function ESX.RefreshContext(...) - exports["esx_context"]:Refresh(...) - end -else - function ESX.OpenContext() - print("[^1ERROR^7] Tried to ^5open^7 context menu, but ^5esx_context^7 is missing!") - end +function ESX.OpenContext(...) + return contextAvailable and exports["esx_context"]:Open(...) + or not contextAvailable + and print("[^1ERROR^7] Tried to ^5open^7 context menu, but ^5esx_context^7 is missing!") +end - function ESX.PreviewContext() - print("[^1ERROR^7] Tried to ^5preview^7 context menu, but ^5esx_context^7 is missing!") - end +function ESX.PreviewContext(...) + return contextAvailable and exports["esx_context"]:Preview(...) + or not contextAvailable + and print("[^1ERROR^7] Tried to ^5preview^7 context menu, but ^5esx_context^7 is missing!") +end - function ESX.CloseContext() - print("[^1ERROR^7] Tried to ^5close^7 context menu, but ^5esx_context^7 is missing!") - end +function ESX.CloseContext(...) + return contextAvailable and exports["esx_context"]:Close(...) + or not contextAvailable + and print("[^1ERROR^7] Tried to ^5close^7 context menu, but ^5esx_context^7 is missing!") +end - function ESX.RefreshContext() - print("[^1ERROR^7] Tried to ^5Refresh^7 context menu, but ^5esx_context^7 is missing!") - end +function ESX.RefreshContext(...) + return contextAvailable and exports["esx_context"]:Refresh(...) + or not contextAvailable + and print("[^1ERROR^7] Tried to ^5Refresh^7 context menu, but ^5esx_context^7 is missing!") end ESX.RegisterInput = function(command_name, label, input_group, key, on_press, on_release) @@ -196,26 +162,19 @@ ESX.RegisterInput = function(command_name, label, input_group, key, on_press, on RegisterKeyMapping(on_release ~= nil and "+" .. command_name or command_name, label, input_group, key) end -function ESX.TriggerServerCallback(name, cb, ...) - local Invoke = GetInvokingResource() or "unknown" - Core.ServerCallbacks[Core.CurrentRequestId] = cb - - TriggerServerEvent("esx:triggerServerCallback", name, Core.CurrentRequestId, Invoke, ...) - Core.CurrentRequestId = Core.CurrentRequestId < 65535 and Core.CurrentRequestId + 1 or 0 -end - -function ESX.UI.Menu.RegisterType(type, open, close) - ESX.UI.Menu.RegisteredTypes[type] = { +function ESX.UI.Menu.RegisterType(menuType, open, close) + ESX.UI.Menu.RegisteredTypes[menuType] = { open = open, close = close, } end -function ESX.UI.Menu.Open(type, namespace, name, data, submit, cancel, change, close) +function ESX.UI.Menu.Open(menuType, namespace, name, data, submit, cancel, change, close) local menu = {} - menu.type = type + menu.type = menuType menu.namespace = namespace + menu.resourceName = (GetInvokingResource() or "Unknown") menu.name = name menu.data = data menu.submit = submit @@ -223,12 +182,12 @@ function ESX.UI.Menu.Open(type, namespace, name, data, submit, cancel, change, c menu.change = change menu.close = function() - ESX.UI.Menu.RegisteredTypes[type].close(namespace, name) + ESX.UI.Menu.RegisteredTypes[menuType].close(namespace, name) for i = 1, #ESX.UI.Menu.Opened, 1 do if ESX.UI.Menu.Opened[i] then if - ESX.UI.Menu.Opened[i].type == type + ESX.UI.Menu.Opened[i].type == menuType and ESX.UI.Menu.Opened[i].namespace == namespace and ESX.UI.Menu.Opened[i].name == name then @@ -261,7 +220,7 @@ function ESX.UI.Menu.Open(type, namespace, name, data, submit, cancel, change, c end menu.refresh = function() - ESX.UI.Menu.RegisteredTypes[type].open(namespace, name, menu.data) + ESX.UI.Menu.RegisteredTypes[menuType].open(namespace, name, menu.data) end menu.setElement = function(i, key, val) @@ -290,16 +249,16 @@ function ESX.UI.Menu.Open(type, namespace, name, data, submit, cancel, change, c end ESX.UI.Menu.Opened[#ESX.UI.Menu.Opened + 1] = menu - ESX.UI.Menu.RegisteredTypes[type].open(namespace, name, data) + ESX.UI.Menu.RegisteredTypes[menuType].open(namespace, name, data) return menu end -function ESX.UI.Menu.Close(type, namespace, name) +function ESX.UI.Menu.Close(menuType, namespace, name) for i = 1, #ESX.UI.Menu.Opened, 1 do if ESX.UI.Menu.Opened[i] then if - ESX.UI.Menu.Opened[i].type == type + ESX.UI.Menu.Opened[i].type == menuType and ESX.UI.Menu.Opened[i].namespace == namespace and ESX.UI.Menu.Opened[i].name == name then @@ -319,11 +278,11 @@ function ESX.UI.Menu.CloseAll() end end -function ESX.UI.Menu.GetOpened(type, namespace, name) +function ESX.UI.Menu.GetOpened(menuType, namespace, name) for i = 1, #ESX.UI.Menu.Opened, 1 do if ESX.UI.Menu.Opened[i] then if - ESX.UI.Menu.Opened[i].type == type + ESX.UI.Menu.Opened[i].type == menuType and ESX.UI.Menu.Opened[i].namespace == namespace and ESX.UI.Menu.Opened[i].name == name then @@ -337,8 +296,8 @@ function ESX.UI.Menu.GetOpenedMenus() return ESX.UI.Menu.Opened end -function ESX.UI.Menu.IsOpen(type, namespace, name) - return ESX.UI.Menu.GetOpened(type, namespace, name) ~= nil +function ESX.UI.Menu.IsOpen(menuType, namespace, name) + return ESX.UI.Menu.GetOpened(menuType, namespace, name) ~= nil end function ESX.UI.ShowInventoryItemNotification(add, item, count) @@ -385,34 +344,17 @@ end function ESX.Game.SpawnObject(object, coords, cb, networked) networked = networked == nil and true or networked - if networked then - ESX.TriggerServerCallback("esx:Onesync:SpawnObject", function(NetworkID) - if cb then - local obj = NetworkGetEntityFromNetworkId(NetworkID) - local Tries = 0 - while not DoesEntityExist(obj) do - obj = NetworkGetEntityFromNetworkId(NetworkID) - Wait(0) - Tries = Tries + 1 - if Tries > 250 then - break - end - end - cb(obj) - end - end, object, coords, 0.0) - else - local model = type(object) == "number" and object or joaat(object) - local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z) - CreateThread(function() - ESX.Streaming.RequestModel(model) - - local obj = CreateObject(model, vector.xyz, networked, false, true) - if cb then - cb(obj) - end - end) - end + + local model = type(object) == "number" and object or joaat(object) + local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z) + CreateThread(function() + ESX.Streaming.RequestModel(model) + + local obj = CreateObject(model, vector.xyz, networked, false, true) + if cb then + cb(obj) + end + end) end function ESX.Game.SpawnLocalObject(object, coords, cb) @@ -429,13 +371,12 @@ function ESX.Game.DeleteObject(object) DeleteObject(object) end -function ESX.Game.SpawnVehicle(vehicle, coords, heading, cb, networked) - local model = type(vehicle) == "number" and vehicle or joaat(vehicle) +function ESX.Game.SpawnVehicle(vehicleModel, coords, heading, cb, networked) + local model = type(vehicleModel) == "number" and vehicleModel or joaat(vehicleModel) local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z) networked = networked == nil and true or networked local playerCoords = GetEntityCoords(ESX.PlayerData.ped) - if not vector or not playerCoords then return end @@ -453,25 +394,25 @@ function ESX.Game.SpawnVehicle(vehicle, coords, heading, cb, networked) CreateThread(function() ESX.Streaming.RequestModel(model) - local vehicleEntity = CreateVehicle(model, vector.x, vector.y, vector.z, heading, networked, true) + local vehicle = CreateVehicle(model, vector.xyz, heading, networked, true) if networked then - local id = NetworkGetNetworkIdFromEntity(vehicleEntity) + local id = NetworkGetNetworkIdFromEntity(vehicle) SetNetworkIdCanMigrate(id, true) - SetEntityAsMissionEntity(vehicleEntity, true, true) + SetEntityAsMissionEntity(vehicle, true, true) end - SetVehicleHasBeenOwnedByPlayer(vehicleEntity, true) - SetVehicleNeedsToBeHotwired(vehicleEntity, false) + SetVehicleHasBeenOwnedByPlayer(vehicle, true) + SetVehicleNeedsToBeHotwired(vehicle, false) SetModelAsNoLongerNeeded(model) - SetVehRadioStation(vehicleEntity, "OFF") + SetVehRadioStation(vehicle, "OFF") - RequestCollisionAtCoord(vector.x, vector.y, vector.z) - while not HasCollisionLoadedAroundEntity(vehicleEntity) do + RequestCollisionAtCoord(vector.xyz) + while not HasCollisionLoadedAroundEntity(vehicle) do Wait(0) end if cb then - cb(vehicleEntity) + cb(vehicle) end end) end @@ -492,20 +433,19 @@ function ESX.Game.GetObjects() -- Leave the function for compatibility end function ESX.Game.GetPeds(onlyOtherPeds) - local myPed, pool = ESX.PlayerData.ped, GetGamePool("CPed") - if not onlyOtherPeds then - return pool - end - - local peds = {} - - for i = 1, #pool do - if pool[i] ~= myPed then - peds[#peds + 1] = pool[i] + local pool = GetGamePool("CPed") + + if onlyOtherPeds then + local myPed = ESX.PlayerData.ped + for i = 1, #pool do + if pool[i] == myPed then + table.remove(pool, i) + break + end end end - return peds + return pool end function ESX.Game.GetVehicles() -- Leave the function for compatibility @@ -514,15 +454,17 @@ end function ESX.Game.GetPlayers(onlyOtherPlayers, returnKeyValue, returnPeds) local players, myPlayer = {}, PlayerId() + local active = GetActivePlayers() - for _, player in ipairs(GetActivePlayers()) do - local ped = GetPlayerPed(player) + for i = 1, #active do + local currentPlayer = active[i] + local ped = GetPlayerPed(currentPlayer) - if DoesEntityExist(ped) and ((onlyOtherPlayers and player ~= myPlayer) or not onlyOtherPlayers) then + if DoesEntityExist(ped) and ((onlyOtherPlayers and currentPlayer ~= myPlayer) or not onlyOtherPlayers) then if returnKeyValue then - players[player] = ped + players[currentPlayer] = ped else - players[#players + 1] = returnPeds and ped or player + players[#players + 1] = returnPeds and ped or currentPlayer end end end @@ -626,425 +568,436 @@ function ESX.Game.GetVehicleInDirection() end function ESX.Game.GetVehicleProperties(vehicle) - if DoesEntityExist(vehicle) then - local colorPrimary, colorSecondary = GetVehicleColours(vehicle) - local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) - local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle) - local customPrimaryColor = nil - if hasCustomPrimaryColor then - local r, g, b = GetVehicleCustomPrimaryColour(vehicle) - customPrimaryColor = { r, g, b } - end + if not DoesEntityExist(vehicle) then + return + end - local customXenonColorR, customXenonColorG, customXenonColorB = GetVehicleXenonLightsCustomColor(vehicle) - local customXenonColor = nil - if customXenonColorR and customXenonColorG and customXenonColorB then - customXenonColor = { customXenonColorR, customXenonColorG, customXenonColorB } - end + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) + local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) + local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle) + local dashboardColor = GetVehicleDashboardColor(vehicle) + local interiorColor = GetVehicleInteriorColour(vehicle) + local customPrimaryColor = nil + if hasCustomPrimaryColor then + customPrimaryColor = { GetVehicleCustomPrimaryColour(vehicle) } + end - local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle) - local customSecondaryColor = nil - if hasCustomSecondaryColor then - local r, g, b = GetVehicleCustomSecondaryColour(vehicle) - customSecondaryColor = { r, g, b } - end - local extras = {} + local hasCustomXenonColor, customXenonColorR, customXenonColorG, customXenonColorB = + GetVehicleXenonLightsCustomColor(vehicle) + local customXenonColor = nil + if hasCustomXenonColor then + customXenonColor = { customXenonColorR, customXenonColorG, customXenonColorB } + end - for extraId = 0, 12 do - if DoesExtraExist(vehicle, extraId) then - local state = IsVehicleExtraTurnedOn(vehicle, extraId) - extras[tostring(extraId)] = state - end + local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle) + local customSecondaryColor = nil + if hasCustomSecondaryColor then + customSecondaryColor = { GetVehicleCustomSecondaryColour(vehicle) } + end + + local extras = {} + for extraId = 0, 20 do + if DoesExtraExist(vehicle, extraId) then + extras[tostring(extraId)] = IsVehicleExtraTurnedOn(vehicle, extraId) end + end - local doorsBroken, windowsBroken, tyreBurst = {}, {}, {} - local numWheels = tostring(GetVehicleNumberOfWheels(vehicle)) + local doorsBroken, windowsBroken, tyreBurst = {}, {}, {} + local numWheels = tostring(GetVehicleNumberOfWheels(vehicle)) - local TyresIndex = { -- Wheel index list according to the number of vehicle wheels. - ["2"] = { 0, 4 }, -- Bike and cycle. - ["3"] = { 0, 1, 4, 5 }, -- Vehicle with 3 wheels (get for wheels because some 3 wheels vehicles have 2 wheels on front and one rear or the reverse). - ["4"] = { 0, 1, 4, 5 }, -- Vehicle with 4 wheels. - ["6"] = { 0, 1, 2, 3, 4, 5 }, -- Vehicle with 6 wheels. - } + local TyresIndex = { -- Wheel index list according to the number of vehicle wheels. + ["2"] = { 0, 4 }, -- Bike and cycle. + ["3"] = { 0, 1, 4, 5 }, -- Vehicle with 3 wheels (get for wheels because some 3 wheels vehicles have 2 wheels on front and one rear or the reverse). + ["4"] = { 0, 1, 4, 5 }, -- Vehicle with 4 wheels. + ["6"] = { 0, 1, 2, 3, 4, 5 }, -- Vehicle with 6 wheels. + } - if TyresIndex[numWheels] then - for _, idx in pairs(TyresIndex[numWheels]) do - if IsVehicleTyreBurst(vehicle, idx, false) then - tyreBurst[tostring(idx)] = true - else - tyreBurst[tostring(idx)] = false - end - end + if TyresIndex[numWheels] then + for _, idx in pairs(TyresIndex[numWheels]) do + tyreBurst[tostring(idx)] = IsVehicleTyreBurst(vehicle, idx, false) end + end - for windowId = 0, 7 do -- 13 - if not IsVehicleWindowIntact(vehicle, windowId) then - windowsBroken[tostring(windowId)] = true - else - windowsBroken[tostring(windowId)] = false - end - end + for windowId = 0, 7 do -- 13 + RollUpWindow(vehicle, windowId) --fix when you put the car away with the window down + windowsBroken[tostring(windowId)] = not IsVehicleWindowIntact(vehicle, windowId) + end - local numDoors = GetNumberOfVehicleDoors(vehicle) - if numDoors and numDoors > 0 then - for doorsId = 0, numDoors do - if IsVehicleDoorDamaged(vehicle, doorsId) then - doorsBroken[tostring(doorsId)] = true - else - doorsBroken[tostring(doorsId)] = false - end - end + local numDoors = GetNumberOfVehicleDoors(vehicle) + if numDoors and numDoors > 0 then + for doorsId = 0, numDoors do + doorsBroken[tostring(doorsId)] = IsVehicleDoorDamaged(vehicle, doorsId) end - - return { - model = GetEntityModel(vehicle), - doorsBroken = doorsBroken, - windowsBroken = windowsBroken, - tyreBurst = tyreBurst, - plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)), - plateIndex = GetVehicleNumberPlateTextIndex(vehicle), - - bodyHealth = ESX.Math.Round(GetVehicleBodyHealth(vehicle), 1), - engineHealth = ESX.Math.Round(GetVehicleEngineHealth(vehicle), 1), - tankHealth = ESX.Math.Round(GetVehiclePetrolTankHealth(vehicle), 1), - - fuelLevel = ESX.Math.Round(GetVehicleFuelLevel(vehicle), 1), - dirtLevel = ESX.Math.Round(GetVehicleDirtLevel(vehicle), 1), - color1 = colorPrimary, - color2 = colorSecondary, - customPrimaryColor = customPrimaryColor, - customSecondaryColor = customSecondaryColor, - - pearlescentColor = pearlescentColor, - wheelColor = wheelColor, - - wheels = GetVehicleWheelType(vehicle), - windowTint = GetVehicleWindowTint(vehicle), - xenonColor = GetVehicleXenonLightsColor(vehicle), - customXenonColor = customXenonColor, - - neonEnabled = { - IsVehicleNeonLightEnabled(vehicle, 0), - IsVehicleNeonLightEnabled(vehicle, 1), - IsVehicleNeonLightEnabled(vehicle, 2), - IsVehicleNeonLightEnabled(vehicle, 3), - }, - - neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)), - extras = extras, - tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)), - - modSpoilers = GetVehicleMod(vehicle, 0), - modFrontBumper = GetVehicleMod(vehicle, 1), - modRearBumper = GetVehicleMod(vehicle, 2), - modSideSkirt = GetVehicleMod(vehicle, 3), - modExhaust = GetVehicleMod(vehicle, 4), - modFrame = GetVehicleMod(vehicle, 5), - modGrille = GetVehicleMod(vehicle, 6), - modHood = GetVehicleMod(vehicle, 7), - modFender = GetVehicleMod(vehicle, 8), - modRightFender = GetVehicleMod(vehicle, 9), - modRoof = GetVehicleMod(vehicle, 10), - - modEngine = GetVehicleMod(vehicle, 11), - modBrakes = GetVehicleMod(vehicle, 12), - modTransmission = GetVehicleMod(vehicle, 13), - modHorns = GetVehicleMod(vehicle, 14), - modSuspension = GetVehicleMod(vehicle, 15), - modArmor = GetVehicleMod(vehicle, 16), - - modTurbo = IsToggleModOn(vehicle, 18), - modSmokeEnabled = IsToggleModOn(vehicle, 20), - modXenon = IsToggleModOn(vehicle, 22), - - modFrontWheels = GetVehicleMod(vehicle, 23), - modBackWheels = GetVehicleMod(vehicle, 24), - - modPlateHolder = GetVehicleMod(vehicle, 25), - modVanityPlate = GetVehicleMod(vehicle, 26), - modTrimA = GetVehicleMod(vehicle, 27), - modOrnaments = GetVehicleMod(vehicle, 28), - modDashboard = GetVehicleMod(vehicle, 29), - modDial = GetVehicleMod(vehicle, 30), - modDoorSpeaker = GetVehicleMod(vehicle, 31), - modSeats = GetVehicleMod(vehicle, 32), - modSteeringWheel = GetVehicleMod(vehicle, 33), - modShifterLeavers = GetVehicleMod(vehicle, 34), - modAPlate = GetVehicleMod(vehicle, 35), - modSpeakers = GetVehicleMod(vehicle, 36), - modTrunk = GetVehicleMod(vehicle, 37), - modHydrolic = GetVehicleMod(vehicle, 38), - modEngineBlock = GetVehicleMod(vehicle, 39), - modAirFilter = GetVehicleMod(vehicle, 40), - modStruts = GetVehicleMod(vehicle, 41), - modArchCover = GetVehicleMod(vehicle, 42), - modAerials = GetVehicleMod(vehicle, 43), - modTrimB = GetVehicleMod(vehicle, 44), - modTank = GetVehicleMod(vehicle, 45), - modDoorR = GetVehicleMod(vehicle, 47), - modLivery = GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) or GetVehicleMod(vehicle, 48), - modLightbar = GetVehicleMod(vehicle, 49), - } - else - return end + + return { + model = GetEntityModel(vehicle), + doorsBroken = doorsBroken, + windowsBroken = windowsBroken, + tyreBurst = tyreBurst, + tyresCanBurst = GetVehicleTyresCanBurst(vehicle), + plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)), + plateIndex = GetVehicleNumberPlateTextIndex(vehicle), + + bodyHealth = ESX.Math.Round(GetVehicleBodyHealth(vehicle), 1), + engineHealth = ESX.Math.Round(GetVehicleEngineHealth(vehicle), 1), + tankHealth = ESX.Math.Round(GetVehiclePetrolTankHealth(vehicle), 1), + + fuelLevel = ESX.Math.Round(GetVehicleFuelLevel(vehicle), 1), + dirtLevel = ESX.Math.Round(GetVehicleDirtLevel(vehicle), 1), + color1 = colorPrimary, + color2 = colorSecondary, + customPrimaryColor = customPrimaryColor, + customSecondaryColor = customSecondaryColor, + + pearlescentColor = pearlescentColor, + wheelColor = wheelColor, + + dashboardColor = dashboardColor, + interiorColor = interiorColor, + + wheels = GetVehicleWheelType(vehicle), + windowTint = GetVehicleWindowTint(vehicle), + xenonColor = GetVehicleXenonLightsColor(vehicle), + customXenonColor = customXenonColor, + + neonEnabled = { + IsVehicleNeonLightEnabled(vehicle, 0), + IsVehicleNeonLightEnabled(vehicle, 1), + IsVehicleNeonLightEnabled(vehicle, 2), + IsVehicleNeonLightEnabled(vehicle, 3), + }, + + neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)), + extras = extras, + tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)), + + modSpoilers = GetVehicleMod(vehicle, 0), + modFrontBumper = GetVehicleMod(vehicle, 1), + modRearBumper = GetVehicleMod(vehicle, 2), + modSideSkirt = GetVehicleMod(vehicle, 3), + modExhaust = GetVehicleMod(vehicle, 4), + modFrame = GetVehicleMod(vehicle, 5), + modGrille = GetVehicleMod(vehicle, 6), + modHood = GetVehicleMod(vehicle, 7), + modFender = GetVehicleMod(vehicle, 8), + modRightFender = GetVehicleMod(vehicle, 9), + modRoof = GetVehicleMod(vehicle, 10), + modRoofLivery = GetVehicleRoofLivery(vehicle), + + modEngine = GetVehicleMod(vehicle, 11), + modBrakes = GetVehicleMod(vehicle, 12), + modTransmission = GetVehicleMod(vehicle, 13), + modHorns = GetVehicleMod(vehicle, 14), + modSuspension = GetVehicleMod(vehicle, 15), + modArmor = GetVehicleMod(vehicle, 16), + + modTurbo = IsToggleModOn(vehicle, 18), + modSmokeEnabled = IsToggleModOn(vehicle, 20), + modXenon = IsToggleModOn(vehicle, 22), + + modFrontWheels = GetVehicleMod(vehicle, 23), + modCustomFrontWheels = GetVehicleModVariation(vehicle, 23), + modBackWheels = GetVehicleMod(vehicle, 24), + modCustomBackWheels = GetVehicleModVariation(vehicle, 24), + + modPlateHolder = GetVehicleMod(vehicle, 25), + modVanityPlate = GetVehicleMod(vehicle, 26), + modTrimA = GetVehicleMod(vehicle, 27), + modOrnaments = GetVehicleMod(vehicle, 28), + modDashboard = GetVehicleMod(vehicle, 29), + modDial = GetVehicleMod(vehicle, 30), + modDoorSpeaker = GetVehicleMod(vehicle, 31), + modSeats = GetVehicleMod(vehicle, 32), + modSteeringWheel = GetVehicleMod(vehicle, 33), + modShifterLeavers = GetVehicleMod(vehicle, 34), + modAPlate = GetVehicleMod(vehicle, 35), + modSpeakers = GetVehicleMod(vehicle, 36), + modTrunk = GetVehicleMod(vehicle, 37), + modHydrolic = GetVehicleMod(vehicle, 38), + modEngineBlock = GetVehicleMod(vehicle, 39), + modAirFilter = GetVehicleMod(vehicle, 40), + modStruts = GetVehicleMod(vehicle, 41), + modArchCover = GetVehicleMod(vehicle, 42), + modAerials = GetVehicleMod(vehicle, 43), + modTrimB = GetVehicleMod(vehicle, 44), + modTank = GetVehicleMod(vehicle, 45), + modWindows = GetVehicleMod(vehicle, 46), + modLivery = GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) or GetVehicleMod(vehicle, 48), + modLightbar = GetVehicleMod(vehicle, 49), + } end function ESX.Game.SetVehicleProperties(vehicle, props) - if DoesEntityExist(vehicle) then - local colorPrimary, colorSecondary = GetVehicleColours(vehicle) - local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) - SetVehicleModKit(vehicle, 0) + if not DoesEntityExist(vehicle) then + return + end + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) + local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) + SetVehicleModKit(vehicle, 0) - if props.plate then - SetVehicleNumberPlateText(vehicle, props.plate) - end - if props.plateIndex then - SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex) - end - if props.bodyHealth then - SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0) - end - if props.engineHealth then - SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0) - end - if props.tankHealth then - SetVehiclePetrolTankHealth(vehicle, props.tankHealth + 0.0) - end - if props.fuelLevel then - SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) - end - if props.dirtLevel then - SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) - end - if props.customPrimaryColor then - SetVehicleCustomPrimaryColour( - vehicle, - props.customPrimaryColor[1], - props.customPrimaryColor[2], - props.customPrimaryColor[3] - ) - end - if props.customSecondaryColor then - SetVehicleCustomSecondaryColour( - vehicle, - props.customSecondaryColor[1], - props.customSecondaryColor[2], - props.customSecondaryColor[3] - ) - end - if props.color1 then - SetVehicleColours(vehicle, props.color1, colorSecondary) - end - if props.color2 then - SetVehicleColours(vehicle, props.color1 or colorPrimary, props.color2) - end - if props.pearlescentColor then - SetVehicleExtraColours(vehicle, props.pearlescentColor, wheelColor) - end - if props.wheelColor then - SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor) - end - if props.wheels then - SetVehicleWheelType(vehicle, props.wheels) - end - if props.windowTint then - SetVehicleWindowTint(vehicle, props.windowTint) - end + if props.tyresCanBurst ~= nil then + SetVehicleTyresCanBurst(vehicle, props.tyresCanBurst) + end - if props.neonEnabled then - SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1]) - SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2]) - SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3]) - SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4]) - end + if props.plate ~= nil then + SetVehicleNumberPlateText(vehicle, props.plate) + end + if props.plateIndex ~= nil then + SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex) + end + if props.bodyHealth ~= nil then + SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0) + end + if props.engineHealth ~= nil then + SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0) + end + if props.tankHealth ~= nil then + SetVehiclePetrolTankHealth(vehicle, props.tankHealth + 0.0) + end + if props.fuelLevel ~= nil then + SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) + end + if props.dirtLevel ~= nil then + SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) + end + if props.customPrimaryColor ~= nil then + SetVehicleCustomPrimaryColour( + vehicle, + props.customPrimaryColor[1], + props.customPrimaryColor[2], + props.customPrimaryColor[3] + ) + end + if props.customSecondaryColor ~= nil then + SetVehicleCustomSecondaryColour( + vehicle, + props.customSecondaryColor[1], + props.customSecondaryColor[2], + props.customSecondaryColor[3] + ) + end + if props.color1 ~= nil then + SetVehicleColours(vehicle, props.color1, colorSecondary) + end + if props.color2 ~= nil then + SetVehicleColours(vehicle, props.color1 or colorPrimary, props.color2) + end + if props.pearlescentColor ~= nil then + SetVehicleExtraColours(vehicle, props.pearlescentColor, wheelColor) + end - if props.extras then - for extraId, enabled in pairs(props.extras) do - if enabled then - SetVehicleExtra(vehicle, tonumber(extraId), 0) - else - SetVehicleExtra(vehicle, tonumber(extraId), 1) - end - end - end + if props.interiorColor ~= nil then + SetVehicleInteriorColor(vehicle, props.interiorColor) + end - if props.neonColor then - SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3]) - end - if props.xenonColor then - SetVehicleXenonLightsColor(vehicle, props.xenonColor) - end - if props.customXenonColor then - SetVehicleXenonLightsCustomColor( - vehicle, - props.customXenonColor[1], - props.customXenonColor[2], - props.customXenonColor[3] - ) - end - if props.modSmokeEnabled then - ToggleVehicleMod(vehicle, 20, true) - end - if props.tyreSmokeColor then - SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3]) - end - if props.modSpoilers then - SetVehicleMod(vehicle, 0, props.modSpoilers, false) - end - if props.modFrontBumper then - SetVehicleMod(vehicle, 1, props.modFrontBumper, false) - end - if props.modRearBumper then - SetVehicleMod(vehicle, 2, props.modRearBumper, false) - end - if props.modSideSkirt then - SetVehicleMod(vehicle, 3, props.modSideSkirt, false) - end - if props.modExhaust then - SetVehicleMod(vehicle, 4, props.modExhaust, false) - end - if props.modFrame then - SetVehicleMod(vehicle, 5, props.modFrame, false) - end - if props.modGrille then - SetVehicleMod(vehicle, 6, props.modGrille, false) - end - if props.modHood then - SetVehicleMod(vehicle, 7, props.modHood, false) - end - if props.modFender then - SetVehicleMod(vehicle, 8, props.modFender, false) - end - if props.modRightFender then - SetVehicleMod(vehicle, 9, props.modRightFender, false) - end - if props.modRoof then - SetVehicleMod(vehicle, 10, props.modRoof, false) - end - if props.modEngine then - SetVehicleMod(vehicle, 11, props.modEngine, false) - end - if props.modBrakes then - SetVehicleMod(vehicle, 12, props.modBrakes, false) - end - if props.modTransmission then - SetVehicleMod(vehicle, 13, props.modTransmission, false) - end - if props.modHorns then - SetVehicleMod(vehicle, 14, props.modHorns, false) - end - if props.modSuspension then - SetVehicleMod(vehicle, 15, props.modSuspension, false) - end - if props.modArmor then - SetVehicleMod(vehicle, 16, props.modArmor, false) - end - if props.modTurbo then - ToggleVehicleMod(vehicle, 18, props.modTurbo) - end - if props.modXenon then - ToggleVehicleMod(vehicle, 22, props.modXenon) - end - if props.modFrontWheels then - SetVehicleMod(vehicle, 23, props.modFrontWheels, false) - end - if props.modBackWheels then - SetVehicleMod(vehicle, 24, props.modBackWheels, false) - end - if props.modPlateHolder then - SetVehicleMod(vehicle, 25, props.modPlateHolder, false) - end - if props.modVanityPlate then - SetVehicleMod(vehicle, 26, props.modVanityPlate, false) - end - if props.modTrimA then - SetVehicleMod(vehicle, 27, props.modTrimA, false) - end - if props.modOrnaments then - SetVehicleMod(vehicle, 28, props.modOrnaments, false) - end - if props.modDashboard then - SetVehicleMod(vehicle, 29, props.modDashboard, false) - end - if props.modDial then - SetVehicleMod(vehicle, 30, props.modDial, false) - end - if props.modDoorSpeaker then - SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false) - end - if props.modSeats then - SetVehicleMod(vehicle, 32, props.modSeats, false) - end - if props.modSteeringWheel then - SetVehicleMod(vehicle, 33, props.modSteeringWheel, false) - end - if props.modShifterLeavers then - SetVehicleMod(vehicle, 34, props.modShifterLeavers, false) - end - if props.modAPlate then - SetVehicleMod(vehicle, 35, props.modAPlate, false) - end - if props.modSpeakers then - SetVehicleMod(vehicle, 36, props.modSpeakers, false) - end - if props.modTrunk then - SetVehicleMod(vehicle, 37, props.modTrunk, false) - end - if props.modHydrolic then - SetVehicleMod(vehicle, 38, props.modHydrolic, false) - end - if props.modEngineBlock then - SetVehicleMod(vehicle, 39, props.modEngineBlock, false) - end - if props.modAirFilter then - SetVehicleMod(vehicle, 40, props.modAirFilter, false) - end - if props.modStruts then - SetVehicleMod(vehicle, 41, props.modStruts, false) - end - if props.modArchCover then - SetVehicleMod(vehicle, 42, props.modArchCover, false) - end - if props.modAerials then - SetVehicleMod(vehicle, 43, props.modAerials, false) - end - if props.modTrimB then - SetVehicleMod(vehicle, 44, props.modTrimB, false) - end - if props.modTank then - SetVehicleMod(vehicle, 45, props.modTank, false) - end - if props.modWindows then - SetVehicleMod(vehicle, 46, props.modWindows, false) - end + if props.dashboardColor ~= nil then + SetVehicleDashboardColor(vehicle, props.dashboardColor) + end + + if props.wheelColor ~= nil then + SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor) + end + if props.wheels ~= nil then + SetVehicleWheelType(vehicle, props.wheels) + end + if props.windowTint ~= nil then + SetVehicleWindowTint(vehicle, props.windowTint) + end - if props.modLivery then - SetVehicleMod(vehicle, 48, props.modLivery, false) - SetVehicleLivery(vehicle, props.modLivery) + if props.neonEnabled ~= nil then + SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1]) + SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2]) + SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3]) + SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4]) + end + + if props.extras ~= nil then + for extraId, enabled in pairs(props.extras) do + SetVehicleExtra(vehicle, tonumber(extraId), enabled and 0 or 1) end + end - if props.windowsBroken then - for k, v in pairs(props.windowsBroken) do - if v then - SmashVehicleWindow(vehicle, tonumber(k)) - end + if props.neonColor ~= nil then + SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3]) + end + if props.xenonColor ~= nil then + SetVehicleXenonLightsColor(vehicle, props.xenonColor) + end + if props.customXenonColor ~= nil then + SetVehicleXenonLightsCustomColor( + vehicle, + props.customXenonColor[1], + props.customXenonColor[2], + props.customXenonColor[3] + ) + end + if props.modSmokeEnabled ~= nil then + ToggleVehicleMod(vehicle, 20, true) + end + if props.tyreSmokeColor ~= nil then + SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3]) + end + if props.modSpoilers ~= nil then + SetVehicleMod(vehicle, 0, props.modSpoilers, false) + end + if props.modFrontBumper ~= nil then + SetVehicleMod(vehicle, 1, props.modFrontBumper, false) + end + if props.modRearBumper ~= nil then + SetVehicleMod(vehicle, 2, props.modRearBumper, false) + end + if props.modSideSkirt ~= nil then + SetVehicleMod(vehicle, 3, props.modSideSkirt, false) + end + if props.modExhaust ~= nil then + SetVehicleMod(vehicle, 4, props.modExhaust, false) + end + if props.modFrame ~= nil then + SetVehicleMod(vehicle, 5, props.modFrame, false) + end + if props.modGrille ~= nil then + SetVehicleMod(vehicle, 6, props.modGrille, false) + end + if props.modHood ~= nil then + SetVehicleMod(vehicle, 7, props.modHood, false) + end + if props.modFender ~= nil then + SetVehicleMod(vehicle, 8, props.modFender, false) + end + if props.modRightFender ~= nil then + SetVehicleMod(vehicle, 9, props.modRightFender, false) + end + if props.modRoof ~= nil then + SetVehicleMod(vehicle, 10, props.modRoof, false) + end + + if props.modRoofLivery ~= nil then + SetVehicleRoofLivery(vehicle, props.modRoofLivery) + end + + if props.modEngine ~= nil then + SetVehicleMod(vehicle, 11, props.modEngine, false) + end + if props.modBrakes ~= nil then + SetVehicleMod(vehicle, 12, props.modBrakes, false) + end + if props.modTransmission ~= nil then + SetVehicleMod(vehicle, 13, props.modTransmission, false) + end + if props.modHorns ~= nil then + SetVehicleMod(vehicle, 14, props.modHorns, false) + end + if props.modSuspension ~= nil then + SetVehicleMod(vehicle, 15, props.modSuspension, false) + end + if props.modArmor ~= nil then + SetVehicleMod(vehicle, 16, props.modArmor, false) + end + if props.modTurbo ~= nil then + ToggleVehicleMod(vehicle, 18, props.modTurbo) + end + if props.modXenon ~= nil then + ToggleVehicleMod(vehicle, 22, props.modXenon) + end + if props.modFrontWheels ~= nil then + SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomFrontWheels) + end + if props.modBackWheels ~= nil then + SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomBackWheels) + end + if props.modPlateHolder ~= nil then + SetVehicleMod(vehicle, 25, props.modPlateHolder, false) + end + if props.modVanityPlate ~= nil then + SetVehicleMod(vehicle, 26, props.modVanityPlate, false) + end + if props.modTrimA ~= nil then + SetVehicleMod(vehicle, 27, props.modTrimA, false) + end + if props.modOrnaments ~= nil then + SetVehicleMod(vehicle, 28, props.modOrnaments, false) + end + if props.modDashboard ~= nil then + SetVehicleMod(vehicle, 29, props.modDashboard, false) + end + if props.modDial ~= nil then + SetVehicleMod(vehicle, 30, props.modDial, false) + end + if props.modDoorSpeaker ~= nil then + SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false) + end + if props.modSeats ~= nil then + SetVehicleMod(vehicle, 32, props.modSeats, false) + end + if props.modSteeringWheel ~= nil then + SetVehicleMod(vehicle, 33, props.modSteeringWheel, false) + end + if props.modShifterLeavers ~= nil then + SetVehicleMod(vehicle, 34, props.modShifterLeavers, false) + end + if props.modAPlate ~= nil then + SetVehicleMod(vehicle, 35, props.modAPlate, false) + end + if props.modSpeakers ~= nil then + SetVehicleMod(vehicle, 36, props.modSpeakers, false) + end + if props.modTrunk ~= nil then + SetVehicleMod(vehicle, 37, props.modTrunk, false) + end + if props.modHydrolic ~= nil then + SetVehicleMod(vehicle, 38, props.modHydrolic, false) + end + if props.modEngineBlock ~= nil then + SetVehicleMod(vehicle, 39, props.modEngineBlock, false) + end + if props.modAirFilter ~= nil then + SetVehicleMod(vehicle, 40, props.modAirFilter, false) + end + if props.modStruts ~= nil then + SetVehicleMod(vehicle, 41, props.modStruts, false) + end + if props.modArchCover ~= nil then + SetVehicleMod(vehicle, 42, props.modArchCover, false) + end + if props.modAerials ~= nil then + SetVehicleMod(vehicle, 43, props.modAerials, false) + end + if props.modTrimB ~= nil then + SetVehicleMod(vehicle, 44, props.modTrimB, false) + end + if props.modTank ~= nil then + SetVehicleMod(vehicle, 45, props.modTank, false) + end + if props.modWindows ~= nil then + SetVehicleMod(vehicle, 46, props.modWindows, false) + end + + if props.modLivery ~= nil then + SetVehicleMod(vehicle, 48, props.modLivery, false) + SetVehicleLivery(vehicle, props.modLivery) + end + + if props.windowsBroken ~= nil then + for k, v in pairs(props.windowsBroken) do + if v then + RemoveVehicleWindow(vehicle, tonumber(k)) end end + end - if props.doorsBroken then - for k, v in pairs(props.doorsBroken) do - if v then - SetVehicleDoorBroken(vehicle, tonumber(k), true) - end + if props.doorsBroken ~= nil then + for k, v in pairs(props.doorsBroken) do + if v then + SetVehicleDoorBroken(vehicle, tonumber(k), true) end end + end - if props.tyreBurst then - for k, v in pairs(props.tyreBurst) do - if v then - SetVehicleTyreBurst(vehicle, tonumber(k), true, 1000.0) - end + if props.tyreBurst ~= nil then + for k, v in pairs(props.tyreBurst) do + if v then + SetVehicleTyreBurst(vehicle, tonumber(k), true, 1000.0) end end end @@ -1056,18 +1009,14 @@ function ESX.Game.Utils.DrawText3D(coords, text, size, font) local camCoords = GetFinalRenderedCamCoord() local distance = #(vector - camCoords) - if not size then - size = 1 - end - if not font then - font = 0 - end + size = size or 1 + font = font or 0 local scale = (size / distance) * 2 local fov = (1 / GetGameplayCamFov()) * 100 scale = scale * fov - SetTextScale(0.0 * scale, 0.55 * scale) + SetTextScale(0.0, 0.55 * scale) SetTextFont(font) SetTextProportional(1) SetTextColour(255, 255, 255, 215) @@ -1079,16 +1028,32 @@ function ESX.Game.Utils.DrawText3D(coords, text, size, font) ClearDrawOrigin() end +---@param account string Account name (money/bank/black_money) +---@return table|nil +function ESX.GetAccount(account) + for i = 1, #ESX.PlayerData.accounts, 1 do + if ESX.PlayerData.accounts[i].name == account then + return ESX.PlayerData.accounts[i] + end + end + return nil +end + function ESX.ShowInventory() + if not Config.EnableDefaultInventory then + return + end + local playerPed = ESX.PlayerData.ped local elements = { - { unselectable = true, icon = "fas fa-box", title = "Player Inventory" }, + { unselectable = true, icon = "fas fa-box" }, } local currentWeight = 0 for i = 1, #ESX.PlayerData.accounts do if ESX.PlayerData.accounts[i].money > 0 then - local formattedMoney = _U("locale_currency", ESX.Math.GroupDigits(ESX.PlayerData.accounts[i].money)) + local formattedMoney = + TranslateCap("locale_currency", ESX.Math.GroupDigits(ESX.PlayerData.accounts[i].money)) local canDrop = ESX.PlayerData.accounts[i].name ~= "bank" elements[#elements + 1] = { @@ -1107,7 +1072,8 @@ function ESX.ShowInventory() end end - for _, v in ipairs(ESX.PlayerData.inventory) do + for i = 1, #ESX.PlayerData.inventory do + local v = ESX.PlayerData.inventory[i] if v.count > 0 then currentWeight = currentWeight + (v.weight * v.count) @@ -1124,16 +1090,18 @@ function ESX.ShowInventory() end end - for _, v in ipairs(Config.Weapons) do + elements[1].title = TranslateCap("inventory", currentWeight, Config.MaxWeight) + + for i = 1, #Config.Weapons do + local v = Config.Weapons[i] local weaponHash = joaat(v.name) if HasPedGotWeapon(playerPed, weaponHash, false) then local ammo = GetAmmoInPedWeapon(playerPed, weaponHash) - local label = v.ammo and ("%s - %s %s"):format(v.label, ammo, v.ammo.label) or v.label elements[#elements + 1] = { icon = "fas fa-gun", - title = label, + title = v.ammo and ("%s - %s %s"):format(v.label, ammo, v.ammo.label) or v.label, count = 1, type = "item_weapon", value = v.name, @@ -1146,12 +1114,6 @@ function ESX.ShowInventory() end end - elements[#elements + 1] = { - unselectable = true, - icon = "fas fa-weight", - title = "Current Weight: " .. currentWeight, - } - ESX.CloseContext() ESX.OpenContext("right", elements, function(_, element) @@ -1162,7 +1124,7 @@ function ESX.ShowInventory() if element.usable then elements2[#elements2 + 1] = { icon = "fas fa-utensils", - title = _U("use"), + title = TranslateCap("use"), action = "use", type = element.type, value = element.value, @@ -1173,7 +1135,7 @@ function ESX.ShowInventory() if player ~= -1 and distance <= 3.0 then elements2[#elements2 + 1] = { icon = "fas fa-hands", - title = _U("give"), + title = TranslateCap("give"), action = "give", type = element.type, value = element.value, @@ -1182,7 +1144,7 @@ function ESX.ShowInventory() elements2[#elements2 + 1] = { icon = "fas fa-trash", - title = _U("remove"), + title = TranslateCap("remove"), action = "remove", type = element.type, value = element.value, @@ -1198,7 +1160,7 @@ function ESX.ShowInventory() then elements2[#elements2 + 1] = { icon = "fas fa-gun", - title = _U("giveammo"), + title = TranslateCap("giveammo"), action = "give_ammo", type = element.type, value = element.value, @@ -1207,12 +1169,12 @@ function ESX.ShowInventory() elements2[#elements2 + 1] = { icon = "fas fa-arrow-left", - title = _U("return"), + title = TranslateCap("return"), action = "return", } ESX.OpenContext("right", elements2, function(_, element2) - local item, type = element2.value, element2.type + local item, itemType = element2.value, element2.type if element2.action == "give" then local playersNearby = ESX.Game.GetPlayersInArea(GetEntityCoords(playerPed), 3.0) @@ -1246,18 +1208,24 @@ function ESX.ShowInventory() local selectedPlayerPed = GetPlayerPed(selectedPlayer) if IsPedOnFoot(selectedPlayerPed) and not IsPedFalling(selectedPlayerPed) then - if type == "item_weapon" then - TriggerServerEvent("esx:giveInventoryItem", selectedPlayerId, type, item, nil) + if itemType == "item_weapon" then + TriggerServerEvent( + "esx:giveInventoryItem", + selectedPlayerId, + itemType, + item, + nil + ) ESX.CloseContext() else local elementsG = { { unselectable = true, icon = "fas fa-trash", title = element.title }, { - icon = "fas fa-hashtag", - title = "Amount", + icon = "fas fa-tally", + title = "Amount.", input = true, inputType = "number", - inputPlaceholder = "Amount to give...", + inputPlaceholder = "Amount to give..", inputMin = 1, inputMax = 1000, }, @@ -1271,21 +1239,21 @@ function ESX.ShowInventory() TriggerServerEvent( "esx:giveInventoryItem", selectedPlayerId, - type, + itemType, item, quantity ) ESX.CloseContext() else - ESX.ShowNotification(_U("amount_invalid")) + ESX.ShowNotification(TranslateCap("amount_invalid")) end end) end else - ESX.ShowNotification(_U("in_vehicle")) + ESX.ShowNotification(TranslateCap("in_vehicle")) end else - ESX.ShowNotification(_U("players_nearby")) + ESX.ShowNotification(TranslateCap("players_nearby")) ESX.CloseContext() end end) @@ -1296,21 +1264,21 @@ function ESX.ShowInventory() local dict, anim = "weapons@first_person@aim_rng@generic@projectile@sticky_bomb@", "plant_floor" ESX.Streaming.RequestAnimDict(dict) - if type == "item_weapon" then + if itemType == "item_weapon" then ESX.CloseContext() TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false) RemoveAnimDict(dict) Wait(1000) - TriggerServerEvent("esx:removeInventoryItem", type, item) + TriggerServerEvent("esx:removeInventoryItem", itemType, item) else local elementsR = { { unselectable = true, icon = "fas fa-trash", title = element.title }, { - icon = "fas fa-hashtag", - title = "Amount", + icon = "fas fa-tally", + title = "Amount.", input = true, inputType = "number", - inputPlaceholder = "Amount to remove...", + inputPlaceholder = "Amount to remove..", inputMin = 1, inputMax = 1000, }, @@ -1325,9 +1293,9 @@ function ESX.ShowInventory() TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false) RemoveAnimDict(dict) Wait(1000) - TriggerServerEvent("esx:removeInventoryItem", type, item, quantity) + TriggerServerEvent("esx:removeInventoryItem", itemType, item, quantity) else - ESX.ShowNotification(_U("amount_invalid")) + ESX.ShowNotification(TranslateCap("amount_invalid")) end end) end @@ -1349,11 +1317,11 @@ function ESX.ShowInventory() local elementsGA = { { unselectable = true, icon = "fas fa-trash", title = element.title }, { - icon = "fas fa-hashtag", - title = "Amount", + icon = "fas fa-tally", + title = "Amount.", input = true, inputType = "number", - inputPlaceholder = "Amount to give...", + inputPlaceholder = "Amount to give..", inputMin = 1, inputMax = 1000, }, @@ -1374,35 +1342,29 @@ function ESX.ShowInventory() ) ESX.CloseContext() else - ESX.ShowNotification(_U("noammo")) + ESX.ShowNotification(TranslateCap("noammo")) end else - ESX.ShowNotification(_U("amount_invalid")) + ESX.ShowNotification(TranslateCap("amount_invalid")) end end) else - ESX.ShowNotification(_U("noammo")) + ESX.ShowNotification(TranslateCap("noammo")) end else - ESX.ShowNotification(_U("players_nearby")) + ESX.ShowNotification(TranslateCap("players_nearby")) end else - ESX.ShowNotification(_U("in_vehicle")) + ESX.ShowNotification(TranslateCap("in_vehicle")) end end end) end) end -RegisterNetEvent("esx:serverCallback") -AddEventHandler("esx:serverCallback", function(requestId, ...) - Core.ServerCallbacks[requestId](...) - Core.ServerCallbacks[requestId] = nil -end) - RegisterNetEvent("esx:showNotification") -AddEventHandler("esx:showNotification", function(msg, type, length) - ESX.ShowNotification(msg, type, length) +AddEventHandler("esx:showNotification", function(msg, notifyType, length) + ESX.ShowNotification(msg, notifyType, length) end) RegisterNetEvent("esx:showAdvancedNotification") @@ -1421,28 +1383,74 @@ end) AddEventHandler("onResourceStop", function(resourceName) for i = 1, #ESX.UI.Menu.Opened, 1 do if ESX.UI.Menu.Opened[i] then - if ESX.UI.Menu.Opened[i].namespace == resourceName then + if + ESX.UI.Menu.Opened[i].resourceName == resourceName + or ESX.UI.Menu.Opened[i].namespace == resourceName + then ESX.UI.Menu.Opened[i].close() ESX.UI.Menu.Opened[i] = nil end end end end) - --- SetTimeout -CreateThread(function() - while true do - local sleep = 100 - if #Core.TimeoutCallbacks > 0 then - local currTime = GetGameTimer() - sleep = 0 - for i = 1, #Core.TimeoutCallbacks, 1 do - if currTime >= Core.TimeoutCallbacks[i].time then - Core.TimeoutCallbacks[i].cb() - Core.TimeoutCallbacks[i] = nil - end - end - end - Wait(sleep) +-- Credits to txAdmin for the list. +local mismatchedTypes = { + [`airtug`] = "automobile", -- trailer + [`avisa`] = "submarine", -- boat + [`blimp`] = "heli", -- plane + [`blimp2`] = "heli", -- plane + [`blimp3`] = "heli", -- plane + [`caddy`] = "automobile", -- trailer + [`caddy2`] = "automobile", -- trailer + [`caddy3`] = "automobile", -- trailer + [`chimera`] = "automobile", -- bike + [`docktug`] = "automobile", -- trailer + [`forklift`] = "automobile", -- trailer + [`kosatka`] = "submarine", -- boat + [`mower`] = "automobile", -- trailer + [`policeb`] = "bike", -- automobile + [`ripley`] = "automobile", -- trailer + [`rrocket`] = "automobile", -- bike + [`sadler`] = "automobile", -- trailer + [`sadler2`] = "automobile", -- trailer + [`scrap`] = "automobile", -- trailer + [`slamtruck`] = "automobile", -- trailer + [`Stryder`] = "automobile", -- bike + [`submersible`] = "submarine", -- boat + [`submersible2`] = "submarine", -- boat + [`thruster`] = "heli", -- automobile + [`towtruck`] = "automobile", -- trailer + [`towtruck2`] = "automobile", -- trailer + [`tractor`] = "automobile", -- trailer + [`tractor2`] = "automobile", -- trailer + [`tractor3`] = "automobile", -- trailer + [`trailersmall2`] = "trailer", -- automobile + [`utillitruck`] = "automobile", -- trailer + [`utillitruck2`] = "automobile", -- trailer + [`utillitruck3`] = "automobile", -- trailer +} + +---@param model number|string +---@return string +function ESX.GetVehicleType(model) + model = type(model) == "string" and joaat(model) or model + if not IsModelInCdimage(model) then + return end -end) + if mismatchedTypes[model] then + return mismatchedTypes[model] + end + + local vehicleType = GetVehicleClassFromName(model) + local types = { + [8] = "bike", + [11] = "trailer", + [13] = "bike", + [14] = "boat", + [15] = "heli", + [16] = "plane", + [21] = "train", + } + + return types[vehicleType] or "automobile" +end diff --git a/server-data/resources/[esx]/es_extended/client/main.lua b/server-data/resources/[esx]/es_extended/client/main.lua index 16f638901..b0271c8cf 100644 --- a/server-data/resources/[esx]/es_extended/client/main.lua +++ b/server-data/resources/[esx]/es_extended/client/main.lua @@ -1,7 +1,9 @@ local pickups = {} + CreateThread(function() while not Config.Multichar do - Wait(0) + Wait(100) + if NetworkIsPlayerActive(PlayerId()) then exports.spawnmanager:setAutoSpawn(false) DoScreenFadeOut(0) @@ -16,41 +18,60 @@ RegisterNetEvent("esx:requestModel", function(model) ESX.Streaming.RequestModel(model) end) +function ESX.SpawnPlayer(skin, coords, cb) + local p = promise.new() + TriggerEvent("skinchanger:loadSkin", skin, function() + p:resolve() + end) + Citizen.Await(p) + + local playerPed = PlayerPedId() + FreezeEntityPosition(playerPed, true) + SetEntityCoordsNoOffset(playerPed, coords.x, coords.y, coords.z, false, false, false, true) + SetEntityHeading(playerPed, coords.heading) + while not HasCollisionLoadedAroundEntity(playerPed) do + Wait(0) + end + FreezeEntityPosition(playerPed, false) + NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, coords.heading, true, true, false) + TriggerEvent("playerSpawned", coords) + cb() +end + RegisterNetEvent("esx:playerLoaded") -AddEventHandler("esx:playerLoaded", function(xPlayer, isNew, skin) +AddEventHandler("esx:playerLoaded", function(xPlayer, _, skin) ESX.PlayerData = xPlayer - if Config.Multichar then - Wait(3000) - else - exports.spawnmanager:spawnPlayer({ - x = ESX.PlayerData.coords.x, - y = ESX.PlayerData.coords.y, - z = ESX.PlayerData.coords.z + 0.25, - heading = ESX.PlayerData.coords.heading, - model = `mp_m_freemode_01`, - skipFade = false, - }, function() - TriggerServerEvent("esx:onPlayerSpawn") + if not Config.Multichar then + ESX.SpawnPlayer(skin, ESX.PlayerData.coords, function() TriggerEvent("esx:onPlayerSpawn") TriggerEvent("esx:restoreLoadout") - - if isNew then - TriggerEvent("skinchanger:loadDefaultModel", skin.sex == 0) - elseif skin then - TriggerEvent("skinchanger:loadSkin", skin) - end - + TriggerServerEvent("esx:onPlayerSpawn") TriggerEvent("esx:loadingScreenOff") ShutdownLoadingScreen() ShutdownLoadingScreenNui() end) end + while not DoesEntityExist(ESX.PlayerData.ped) do + Wait(20) + end + ESX.PlayerLoaded = true - while ESX.PlayerData.ped == nil do - Wait(20) + local metadata = ESX.PlayerData.metadata + + if metadata.health then + SetEntityHealth(ESX.PlayerData.ped, metadata.health) + end + + if metadata.armor and metadata.armor > 0 then + SetPedArmour(ESX.PlayerData.ped, metadata.armor) + end + + local timer = GetGameTimer() + while not HaveAllStreamingRequestsCompleted(ESX.PlayerData.ped) and (GetGameTimer() - timer) < 2000 do + Wait(0) end if Config.EnablePVP then @@ -59,7 +80,6 @@ AddEventHandler("esx:playerLoaded", function(xPlayer, isNew, skin) end local playerId = PlayerId() - -- RemoveHudComponents for i = 1, #Config.RemoveHudComponents do if Config.RemoveHudComponents[i] then @@ -75,29 +95,24 @@ AddEventHandler("esx:playerLoaded", function(xPlayer, isNew, skin) end end - -- DisableVehicleRewards - if Config.DisableVehicleRewards then - AddEventHandler("esx:enteredVehicle", function(vehicle) - if GetVehicleClass(vehicle) == 18 then - CreateThread(function() - while true do - DisablePlayerVehicleRewards(playerId) - if not IsPedInAnyVehicle(ESX.PlayerData.ped, false) then - break - end - - Wait(0) - end - end) + if Config.DisableVehicleSeatShuff then + AddEventHandler("esx:enteredVehicle", function(vehicle, _, seat) + if seat == 0 then + SetPedIntoVehicle(ESX.PlayerData.ped, vehicle, 0) + SetPedConfigFlag(ESX.PlayerData.ped, 184, true) end end) end - if Config.DisableHealthRegeneration or Config.DisableWeaponWheel or Config.DisableAimAssist then + if Config.DisableHealthRegeneration then + SetPlayerHealthRechargeMultiplier(playerId, 0.0) + end + + if Config.DisableWeaponWheel or Config.DisableAimAssist or Config.DisableVehicleRewards then CreateThread(function() while true do - if Config.DisableHealthRegeneration then - SetPlayerHealthRechargeMultiplier(playerId, 0.0) + if Config.DisableDisplayAmmo then + DisplayAmmoThisFrame(false) end if Config.DisableWeaponWheel then @@ -105,20 +120,93 @@ AddEventHandler("esx:playerLoaded", function(xPlayer, isNew, skin) DisableControlAction(0, 37, true) end - if Config.DisableDisplayAmmo then - DisplayAmmoThisFrame(false) - end - if Config.DisableAimAssist then if IsPedArmed(ESX.PlayerData.ped, 4) then SetPlayerLockonRangeOverride(playerId, 2.0) end end + if Config.DisableVehicleRewards then + DisablePlayerVehicleRewards(playerId) + end + Wait(0) end end) end + + -- Disable Dispatch services + if Config.DisableDispatchServices then + for i = 1, 15 do + EnableDispatchService(i, false) + end + end + + -- Disable Scenarios + if Config.DisableScenarios then + local scenarios = { + "WORLD_VEHICLE_ATTRACTOR", + "WORLD_VEHICLE_AMBULANCE", + "WORLD_VEHICLE_BICYCLE_BMX", + "WORLD_VEHICLE_BICYCLE_BMX_BALLAS", + "WORLD_VEHICLE_BICYCLE_BMX_FAMILY", + "WORLD_VEHICLE_BICYCLE_BMX_HARMONY", + "WORLD_VEHICLE_BICYCLE_BMX_VAGOS", + "WORLD_VEHICLE_BICYCLE_MOUNTAIN", + "WORLD_VEHICLE_BICYCLE_ROAD", + "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE", + "WORLD_VEHICLE_BIKER", + "WORLD_VEHICLE_BOAT_IDLE", + "WORLD_VEHICLE_BOAT_IDLE_ALAMO", + "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", + "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", + "WORLD_VEHICLE_BROKEN_DOWN", + "WORLD_VEHICLE_BUSINESSMEN", + "WORLD_VEHICLE_HELI_LIFEGUARD", + "WORLD_VEHICLE_CLUCKIN_BELL_TRAILER", + "WORLD_VEHICLE_CONSTRUCTION_SOLO", + "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS", + "WORLD_VEHICLE_DRIVE_PASSENGERS", + "WORLD_VEHICLE_DRIVE_PASSENGERS_LIMITED", + "WORLD_VEHICLE_DRIVE_SOLO", + "WORLD_VEHICLE_FIRE_TRUCK", + "WORLD_VEHICLE_EMPTY", + "WORLD_VEHICLE_MARIACHI", + "WORLD_VEHICLE_MECHANIC", + "WORLD_VEHICLE_MILITARY_PLANES_BIG", + "WORLD_VEHICLE_MILITARY_PLANES_SMALL", + "WORLD_VEHICLE_PARK_PARALLEL", + "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN", + "WORLD_VEHICLE_PASSENGER_EXIT", + "WORLD_VEHICLE_POLICE_BIKE", + "WORLD_VEHICLE_POLICE_CAR", + "WORLD_VEHICLE_POLICE", + "WORLD_VEHICLE_POLICE_NEXT_TO_CAR", + "WORLD_VEHICLE_QUARRY", + "WORLD_VEHICLE_SALTON", + "WORLD_VEHICLE_SALTON_DIRT_BIKE", + "WORLD_VEHICLE_SECURITY_CAR", + "WORLD_VEHICLE_STREETRACE", + "WORLD_VEHICLE_TOURBUS", + "WORLD_VEHICLE_TOURIST", + "WORLD_VEHICLE_TANDL", + "WORLD_VEHICLE_TRACTOR", + "WORLD_VEHICLE_TRACTOR_BEACH", + "WORLD_VEHICLE_TRUCK_LOGS", + "WORLD_VEHICLE_TRUCKS_TRAILERS", + "WORLD_VEHICLE_DISTANT_EMPTY_GROUND", + "WORLD_HUMAN_PAPARAZZI", + } + + for _, v in pairs(scenarios) do + SetScenarioTypeEnabled(v, false) + end + end + + if IsScreenFadedOut() then + DoScreenFadeIn(500) + end + SetDefaultVehicleNumberPlateTextPattern(-1, Config.CustomAIPlates) StartServerSyncLoops() end) @@ -182,24 +270,31 @@ AddEventHandler("esx:restoreLoadout", function() end end) -AddStateBagChangeHandler("VehicleProperties", nil, function(_, _, value) - if value then +-- Credit: https://github.com/LukeWasTakenn, https://github.com/LukeWasTakenn/luke_garages/blob/master/client/client.lua#L331-L352 +AddStateBagChangeHandler("VehicleProperties", nil, function(bagName, _, value) + if not value then + return + end + + local netId = bagName:gsub("entity:", "") + local timer = GetGameTimer() + while not NetworkDoesEntityExistWithNetworkId(tonumber(netId)) do Wait(0) - local NetId = value.NetId - local Vehicle = NetworkGetEntityFromNetworkId(NetId) - local Tries = 0 - while Vehicle == 0 do - Vehicle = NetworkGetEntityFromNetworkId(NetId) - Wait(100) - Tries = Tries + 1 - if Tries > 300 then - break - end + if GetGameTimer() - timer > 10000 then + return end - if NetworkGetEntityOwner(Vehicle) == PlayerId() then - ESX.Game.SetVehicleProperties(Vehicle, value) + end + + local vehicle = NetToVeh(tonumber(netId)) + local timer2 = GetGameTimer() + while NetworkGetEntityOwner(vehicle) ~= PlayerId() do + Wait(0) + if GetGameTimer() - timer2 > 10000 then + return end end + + ESX.Game.SetVehicleProperties(vehicle, value) end) RegisterNetEvent("esx:setAccountMoney") @@ -228,18 +323,18 @@ if not Config.OxInventory then if showNotification then ESX.UI.ShowInventoryItemNotification(true, item, count) end - - if ESX.UI.Menu.IsOpen("default", "es_extended") then - ESX.ShowInventory() - end end) RegisterNetEvent("esx:removeInventoryItem") AddEventHandler("esx:removeInventoryItem", function(item, count, showNotification) - for k, v in ipairs(ESX.PlayerData.inventory) do - if v.name == item then - ESX.UI.ShowInventoryItemNotification(false, v.label, v.count - count) - ESX.PlayerData.inventory[k].count = count + for i = 1, #ESX.PlayerData.inventory do + if ESX.PlayerData.inventory[i].name == item then + ESX.UI.ShowInventoryItemNotification( + false, + ESX.PlayerData.inventory[i].label, + ESX.PlayerData.inventory[i].count - count + ) + ESX.PlayerData.inventory[i].count = count break end end @@ -247,10 +342,6 @@ if not Config.OxInventory then if showNotification then ESX.UI.ShowInventoryItemNotification(false, item, count) end - - if ESX.UI.Menu.IsOpen("default", "es_extended") then - ESX.ShowInventory() - end end) RegisterNetEvent("esx:addWeapon") @@ -278,9 +369,8 @@ if not Config.OxInventory then end) RegisterNetEvent("esx:removeWeapon") - AddEventHandler("esx:removeWeapon", function(weapon) - RemoveWeaponFromPed(ESX.PlayerData.ped, joaat(weapon)) - SetPedAmmo(ESX.PlayerData.ped, joaat(weapon), 0) + AddEventHandler("esx:removeWeapon", function() + print("[^1ERROR^7] event ^5'esx:removeWeapon'^7 Has Been Removed. Please use ^5xPlayer.removeWeapon^7 Instead!") end) RegisterNetEvent("esx:removeWeaponComponent") @@ -297,7 +387,7 @@ end) if not Config.OxInventory then RegisterNetEvent("esx:createPickup") - AddEventHandler("esx:createPickup", function(pickupId, label, coords, type, name, components, tintIndex) + AddEventHandler("esx:createPickup", function(pickupId, label, coords, itemType, name, components, tintIndex) local function setObjectProperties(object) SetEntityAsMissionEntity(object, true, false) PlaceObjectOnGroundProperly(object) @@ -308,11 +398,11 @@ if not Config.OxInventory then obj = object, label = label, inRange = false, - coords = vector3(coords.x, coords.y, coords.z), + coords = coords, } end - if type == "item_weapon" then + if itemType == "item_weapon" then local weaponHash = joaat(name) ESX.Streaming.RequestWeaponAsset(weaponHash) local pickupObject = CreateWeaponObject(weaponHash, 50, coords.x, coords.y, coords.z, true, 1.0, 0) @@ -336,7 +426,7 @@ if not Config.OxInventory then "esx:createPickup", pickupId, pickup.label, - pickup.coords - vector3(0, 0, 1.0), + vector3(pickup.coords.x, pickup.coords.y, pickup.coords.z - 1.0), pickup.type, pickup.name, pickup.components, @@ -401,13 +491,86 @@ function StartServerSyncLoops() end end +if not Config.OxInventory and Config.EnableDefaultInventory then + ESX.RegisterInput("showinv", TranslateCap("keymap_showinventory"), "keyboard", "F2", function() + if not ESX.PlayerData.dead then + ESX.ShowInventory() + end + end) +end + -- disable wanted level if not Config.EnableWantedLevel then ClearPlayerWantedLevel(PlayerId()) SetMaxWantedLevel(0) end ------ Admin commnads from esx_adminplus +if not Config.OxInventory then + CreateThread(function() + while true do + local Sleep = 1500 + local playerCoords = GetEntityCoords(ESX.PlayerData.ped) + local _, closestDistance = ESX.Game.GetClosestPlayer(playerCoords) + + for pickupId, pickup in pairs(pickups) do + local distance = #(playerCoords - pickup.coords) + + if distance < 5 then + Sleep = 0 + local label = pickup.label + + if distance < 1 then + if IsControlJustReleased(0, 38) then + if + IsPedOnFoot(ESX.PlayerData.ped) + and (closestDistance == -1 or closestDistance > 3) + and not pickup.inRange + then + pickup.inRange = true + + local dict, anim = + "weapons@first_person@aim_rng@generic@projectile@sticky_bomb@", "plant_floor" + ESX.Streaming.RequestAnimDict(dict) + TaskPlayAnim( + ESX.PlayerData.ped, + dict, + anim, + 8.0, + 1.0, + 1000, + 16, + 0.0, + false, + false, + false + ) + RemoveAnimDict(dict) + Wait(1000) + + TriggerServerEvent("esx:onPickup", pickupId) + PlaySoundFrontend(-1, "PICK_UP", "HUD_FRONTEND_DEFAULT_SOUNDSET", false) + end + end + + label = ("%s~n~%s"):format(label, TranslateCap("threw_pickup_prompt")) + end + + ESX.Game.Utils.DrawText3D({ + x = pickup.coords.x, + y = pickup.coords.y, + z = pickup.coords.z + 0.25, + }, label, 1.2, 1) + elseif pickup.inRange then + pickup.inRange = false + end + end + Wait(Sleep) + end + end) +end + +----- Admin commands from esx_adminplus + RegisterNetEvent("esx:tpm") AddEventHandler("esx:tpm", function() local GetEntityCoords = GetEntityCoords @@ -419,112 +582,169 @@ AddEventHandler("esx:tpm", function() local GetVehiclePedIsIn = GetVehiclePedIsIn ESX.TriggerServerCallback("esx:isUserAdmin", function(admin) - if admin then - local blipMarker = GetFirstBlipInfoId(8) - if not DoesBlipExist(blipMarker) then - ESX.ShowNotification(_U("nowaipoint"), true, false, 140) - return "marker" - end + if not admin then + return + end + local blipMarker = GetFirstBlipInfoId(8) + if not DoesBlipExist(blipMarker) then + ESX.ShowNotification(TranslateCap("tpm_nowaypoint"), true, false, 140) + return "marker" + end - -- Fade screen to hide how clients get teleported. - DoScreenFadeOut(650) - while not IsScreenFadedOut() do - Wait(0) - end + -- Fade screen to hide how clients get teleported. + DoScreenFadeOut(650) + while not IsScreenFadedOut() do + Wait(0) + end - local ped, coords = ESX.PlayerData.ped, GetBlipInfoIdCoord(blipMarker) - local vehicle = GetVehiclePedIsIn(ped, false) - local oldCoords = GetEntityCoords(ped) - - -- Unpack coords instead of having to unpack them while iterating. - -- 825.0 seems to be the max a player can reach while 0.0 being the lowest. - local x, y, groundZ, Z_START = coords["x"], coords["y"], 850.0, 950.0 - local found = false - if vehicle > 0 then - FreezeEntityPosition(vehicle, true) - else - FreezeEntityPosition(ped, true) - end + local ped, coords = ESX.PlayerData.ped, GetBlipInfoIdCoord(blipMarker) + local vehicle = GetVehiclePedIsIn(ped, false) + local oldCoords = GetEntityCoords(ped) - for i = Z_START, 0, -25.0 do - local z = i - if (i % 2) ~= 0 then - z = Z_START - i - end + -- Unpack coords instead of having to unpack them while iterating. + -- 825.0 seems to be the max a player can reach while 0.0 being the lowest. + local x, y, groundZ, Z_START = coords["x"], coords["y"], 850.0, 950.0 + local found = false + FreezeEntityPosition(vehicle > 0 and vehicle or ped, true) - NewLoadSceneStart(x, y, z, x, y, z, 50.0, 0) - local curTime = GetGameTimer() - while IsNetworkLoadingScene() do - if GetGameTimer() - curTime > 1000 then - break - end - Wait(0) - end - NewLoadSceneStop() - SetPedCoordsKeepVehicle(ped, x, y, z) + for i = Z_START, 0, -25.0 do + local z = i + if (i % 2) ~= 0 then + z = Z_START - i + end - while not HasCollisionLoadedAroundEntity(ped) do - RequestCollisionAtCoord(x, y, z) - if GetGameTimer() - curTime > 1000 then - break - end - Wait(0) + NewLoadSceneStart(x, y, z, x, y, z, 50.0, 0) + local curTime = GetGameTimer() + while IsNetworkLoadingScene() do + if GetGameTimer() - curTime > 1000 then + break end + Wait(0) + end + NewLoadSceneStop() + SetPedCoordsKeepVehicle(ped, x, y, z) - -- Get ground coord. As mentioned in the natives, this only works if the client is in render distance. - found, groundZ = GetGroundZFor_3dCoord(x, y, z, false) - if found then - Wait(0) - SetPedCoordsKeepVehicle(ped, x, y, groundZ) + while not HasCollisionLoadedAroundEntity(ped) do + RequestCollisionAtCoord(x, y, z) + if GetGameTimer() - curTime > 1000 then break end Wait(0) end - -- Remove black screen once the loop has ended. - DoScreenFadeIn(650) - if vehicle > 0 then - FreezeEntityPosition(vehicle, false) - else - FreezeEntityPosition(ped, false) + -- Get ground coord. As mentioned in the natives, this only works if the client is in render distance. + found, groundZ = GetGroundZFor_3dCoord(x, y, z, false) + if found then + Wait(0) + SetPedCoordsKeepVehicle(ped, x, y, groundZ) + break end + Wait(0) + end - if not found then - -- If we can't find the coords, set the coords to the old ones. - -- We don't unpack them before since they aren't in a loop and only called once. - SetPedCoordsKeepVehicle(ped, oldCoords["x"], oldCoords["y"], oldCoords["z"] - 1.0) - ESX.ShowNotification(_U("tpm_success"), true, false, 140) - end + -- Remove black screen once the loop has ended. + DoScreenFadeIn(650) + FreezeEntityPosition(vehicle > 0 and vehicle or ped, false) - -- If Z coord was found, set coords in found coords. - SetPedCoordsKeepVehicle(ped, x, y, groundZ) - ESX.ShowNotification(_U("tpm_success"), true, false, 140) + if not found then + -- If we can't find the coords, set the coords to the old ones. + -- We don't unpack them before since they aren't in a loop and only called once. + SetPedCoordsKeepVehicle(ped, oldCoords["x"], oldCoords["y"], oldCoords["z"] - 1.0) + ESX.ShowNotification(TranslateCap("tpm_success"), true, false, 140) end + + -- If Z coord was found, set coords in found coords. + SetPedCoordsKeepVehicle(ped, x, y, groundZ) + ESX.ShowNotification(TranslateCap("tpm_success"), true, false, 140) end) end) -RegisterNetEvent("esx:repairPedVehicle") -AddEventHandler("esx:repairPedVehicle", function() - local GetVehiclePedIsIn = GetVehiclePedIsIn +local noclip = false +local noclip_pos = vector3(0, 0, 70) +local heading = 0 +local function noclipThread() + while noclip do + SetEntityCoordsNoOffset(ESX.PlayerData.ped, noclip_pos.x, noclip_pos.y, noclip_pos.z, 0, 0, 0) + + if IsControlPressed(1, 34) then + heading = heading + 1.5 + if heading > 360 then + heading = 0 + end + + SetEntityHeading(ESX.PlayerData.ped, heading) + end + + if IsControlPressed(1, 9) then + heading = heading - 1.5 + if heading < 0 then + heading = 360 + end + + SetEntityHeading(ESX.PlayerData.ped, heading) + end + + if IsControlPressed(1, 8) then + noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 1.0, 0.0) + end + + if IsControlPressed(1, 32) then + noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, -1.0, 0.0) + end + + if IsControlPressed(1, 27) then + noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 0.0, 1.0) + end + + if IsControlPressed(1, 173) then + noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 0.0, -1.0) + end + Wait(0) + end +end + +RegisterNetEvent("esx:noclip") +AddEventHandler("esx:noclip", function() ESX.TriggerServerCallback("esx:isUserAdmin", function(admin) if not admin then return end - local ped = ESX.PlayerData.ped - if IsPedInAnyVehicle(ped, false) then - local vehicle = GetVehiclePedIsIn(ped, false) - SetVehicleEngineHealth(vehicle, 1000) - SetVehicleEngineOn(vehicle, true, true) - SetVehicleFixed(vehicle) - SetVehicleDirtLevel(vehicle, 0) - ESX.ShowNotification(_U("command_repair_success"), true, false, 140) - else - ESX.ShowNotification(_U("not_in_vehicle"), true, false, 140) + + if not noclip then + noclip_pos = GetEntityCoords(ESX.PlayerData.ped, false) + heading = GetEntityHeading(ESX.PlayerData.ped) end + + noclip = not noclip + if noclip then + CreateThread(noclipThread) + end + + ESX.ShowNotification( + TranslateCap("noclip_message", noclip and Translate("enabled") or Translate("disabled")), + true, + false, + 140 + ) end) end) +RegisterNetEvent("esx:killPlayer") +AddEventHandler("esx:killPlayer", function() + SetEntityHealth(ESX.PlayerData.ped, 0) +end) + +RegisterNetEvent("esx:repairPedVehicle") +AddEventHandler("esx:repairPedVehicle", function() + local ped = ESX.PlayerData.ped + local vehicle = GetVehiclePedIsIn(ped, false) + SetVehicleEngineHealth(vehicle, 1000) + SetVehicleEngineOn(vehicle, true, true) + SetVehicleFixed(vehicle) + SetVehicleDirtLevel(vehicle, 0) +end) + RegisterNetEvent("esx:freezePlayer") AddEventHandler("esx:freezePlayer", function(input) local player = PlayerId() @@ -539,48 +759,10 @@ AddEventHandler("esx:freezePlayer", function(input) end end) -RegisterNetEvent("esx:GetVehicleType", function(Model, Request) - local ReturnedType = "automobile" - local IsValidModel = IsModelInCdimage(Model) - if IsValidModel == true or IsValidModel == 1 then - local VehicleType = GetVehicleClassFromName(Model) - - if VehicleType == 15 then - ReturnedType = "heli" - elseif VehicleType == 16 then - ReturnedType = "plane" - elseif VehicleType == 14 then - ReturnedType = "boat" - elseif VehicleType == 11 then - ReturnedType = "trailer" - elseif VehicleType == 21 then - ReturnedType = "train" - elseif VehicleType == 13 or VehicleType == 8 then - ReturnedType = "bike" - end - if Model == `submersible` or Model == `submersible2` then - ReturnedType = "submarine" - end - else - ReturnedType = false - end - TriggerServerEvent("esx:ReturnVehicleType", ReturnedType, Request) +ESX.RegisterClientCallback("esx:GetVehicleType", function(cb, model) + cb(ESX.GetVehicleType(model)) end) -local DoNotUse = { - "essentialmode", - "es_admin2", - "basic-gamemode", - "mapmanager", - "fivem-map-skater", - "fivem-map-hipster", - "qb-core", - "default_spawnpoint", - "ox_core", -} - -for i = 1, #DoNotUse do - if GetResourceState(DoNotUse[i]) == "started" or GetResourceState(DoNotUse[i]) == "starting" then - print("[^1ERROR^7] YOU ARE USING A RESOURCE THAT WILL BREAK ^1ESX^7, PLEASE REMOVE ^5" .. DoNotUse[i] .. "^7") - end -end +AddStateBagChangeHandler("metadata", "player:" .. tostring(GetPlayerServerId(PlayerId())), function(_, key, val) + ESX.SetPlayerData(key, val) +end) diff --git a/server-data/resources/[esx]/es_extended/client/modules/actions.lua b/server-data/resources/[esx]/es_extended/client/modules/actions.lua new file mode 100644 index 000000000..de94e476b --- /dev/null +++ b/server-data/resources/[esx]/es_extended/client/modules/actions.lua @@ -0,0 +1,170 @@ +local isInVehicle, isEnteringVehicle, isJumping, inPauseMenu = false, false, false, false +local playerPed = PlayerPedId() +local current = {} + +local function GetPedVehicleSeat(ped, vehicle) + for i = -1, 16 do + if GetPedInVehicleSeat(vehicle, i) == ped then + return i + end + end + return -1 +end + +local function GetData(vehicle) + if not DoesEntityExist(vehicle) then + return + end + local model = GetEntityModel(vehicle) + local displayName = GetDisplayNameFromVehicleModel(model) + local netId = vehicle + if NetworkGetEntityIsNetworked(vehicle) then + netId = VehToNet(vehicle) + end + return displayName, netId +end + +CreateThread(function() + while not ESX.PlayerLoaded do + Wait(200) + end + while true do + ESX.SetPlayerData("coords", GetEntityCoords(playerPed)) + if playerPed ~= PlayerPedId() then + playerPed = PlayerPedId() + ESX.SetPlayerData("ped", playerPed) + TriggerEvent("esx:playerPedChanged", playerPed) + TriggerServerEvent("esx:playerPedChanged", PedToNet(playerPed)) + if Config.DisableHealthRegeneration then + SetPlayerHealthRechargeMultiplier(PlayerId(), 0.0) + end + end + + if IsPedJumping(playerPed) and not isJumping then + isJumping = true + TriggerEvent("esx:playerJumping") + TriggerServerEvent("esx:playerJumping") + elseif not IsPedJumping(playerPed) and isJumping then + isJumping = false + end + + if IsPauseMenuActive() and not inPauseMenu then + inPauseMenu = true + TriggerEvent("esx:pauseMenuActive", inPauseMenu) + elseif not IsPauseMenuActive() and inPauseMenu then + inPauseMenu = false + TriggerEvent("esx:pauseMenuActive", inPauseMenu) + end + + if not isInVehicle and not IsPlayerDead(PlayerId()) then + if DoesEntityExist(GetVehiclePedIsTryingToEnter(playerPed)) and not isEnteringVehicle then + -- trying to enter a vehicle! + local vehicle = GetVehiclePedIsTryingToEnter(playerPed) + local plate = GetVehicleNumberPlateText(vehicle) + local seat = GetSeatPedIsTryingToEnter(playerPed) + local _, netId = GetData(vehicle) + isEnteringVehicle = true + TriggerEvent("esx:enteringVehicle", vehicle, plate, seat, netId) + TriggerServerEvent("esx:enteringVehicle", plate, seat, netId) + elseif + not DoesEntityExist(GetVehiclePedIsTryingToEnter(playerPed)) + and not IsPedInAnyVehicle(playerPed, true) + and isEnteringVehicle + then + -- vehicle entering aborted + TriggerEvent("esx:enteringVehicleAborted") + TriggerServerEvent("esx:enteringVehicleAborted") + isEnteringVehicle = false + elseif IsPedInAnyVehicle(playerPed, false) then + -- suddenly appeared in a vehicle, possible teleport + isEnteringVehicle = false + isInVehicle = true + current.vehicle = GetVehiclePedIsUsing(playerPed) + current.seat = GetPedVehicleSeat(playerPed, current.vehicle) + current.plate = GetVehicleNumberPlateText(current.vehicle) + current.displayName, current.netId = GetData(current.vehicle) + TriggerEvent( + "esx:enteredVehicle", + current.vehicle, + current.plate, + current.seat, + current.displayName, + current.netId + ) + TriggerServerEvent( + "esx:enteredVehicle", + current.plate, + current.seat, + current.displayName, + current.netId + ) + end + elseif isInVehicle then + if not IsPedInAnyVehicle(playerPed, false) or IsPlayerDead(PlayerId()) then + -- bye, vehicle + TriggerEvent( + "esx:exitedVehicle", + current.vehicle, + current.plate, + current.seat, + current.displayName, + current.netId + ) + TriggerServerEvent("esx:exitedVehicle", current.plate, current.seat, current.displayName, current.netId) + isInVehicle = false + current = {} + end + end + Wait(200) + end +end) + +if Config.EnableDebug then + AddEventHandler("esx:playerPedChanged", function(netId) + print("esx:playerPedChanged", netId) + end) + + AddEventHandler("esx:playerJumping", function() + print("esx:playerJumping") + end) + + AddEventHandler("esx:enteringVehicle", function(vehicle, plate, seat, netId) + print("esx:enteringVehicle", "vehicle", vehicle, "plate", plate, "seat", seat, "netId", netId) + end) + + AddEventHandler("esx:enteringVehicleAborted", function() + print("esx:enteringVehicleAborted") + end) + + AddEventHandler("esx:enteredVehicle", function(vehicle, plate, seat, displayName, netId) + print( + "esx:enteredVehicle", + "vehicle", + vehicle, + "plate", + plate, + "seat", + seat, + "displayName", + displayName, + "netId", + netId + ) + end) + + AddEventHandler("esx:exitedVehicle", function(vehicle, plate, seat, displayName, netId) + print( + "esx:exitedVehicle", + "vehicle", + vehicle, + "plate", + plate, + "seat", + seat, + "displayName", + displayName, + "netId", + netId + ) + end) +end diff --git a/server-data/resources/[esx]/es_extended/client/modules/callback.lua b/server-data/resources/[esx]/es_extended/client/modules/callback.lua new file mode 100644 index 000000000..c77000786 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/client/modules/callback.lua @@ -0,0 +1,50 @@ +local RequestId = 0 +local serverRequests = {} + +local clientCallbacks = {} + +---@param eventName string +---@param callback function +---@param ... any +ESX.TriggerServerCallback = function(eventName, callback, ...) + serverRequests[RequestId] = callback + + TriggerServerEvent("esx:triggerServerCallback", eventName, RequestId, GetInvokingResource() or "unknown", ...) + + RequestId = RequestId + 1 +end + +RegisterNetEvent("esx:serverCallback", function(requestId, invoker, ...) + if not serverRequests[requestId] then + return print( + ("[^1ERROR^7] Server Callback with requestId ^5%s^7 Was Called by ^5%s^7 but does not exist."):format( + requestId, + invoker + ) + ) + end + + serverRequests[requestId](...) + serverRequests[requestId] = nil +end) + +---@param eventName string +---@param callback function +ESX.RegisterClientCallback = function(eventName, callback) + clientCallbacks[eventName] = callback +end + +RegisterNetEvent("esx:triggerClientCallback", function(eventName, requestId, invoker, ...) + if not clientCallbacks[eventName] then + return print( + ("[^1ERROR^7] Client Callback not registered, name: ^5%s^7, invoker resource: ^5%s^7"):format( + eventName, + invoker + ) + ) + end + + clientCallbacks[eventName](function(...) + TriggerServerEvent("esx:clientCallback", requestId, invoker, ...) + end, ...) +end) diff --git a/server-data/resources/[esx]/es_extended/client/modules/npwd.lua b/server-data/resources/[esx]/es_extended/client/modules/npwd.lua new file mode 100644 index 000000000..ddbe3b5b8 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/client/modules/npwd.lua @@ -0,0 +1,57 @@ +local npwd = GetResourceState("npwd"):find("start") and exports.npwd or nil + +local function checkPhone() + if not npwd then + return + end + + local phoneItem = ESX.SearchInventory("phone") + npwd:setPhoneDisabled((phoneItem and phoneItem.count or 0) <= 0) +end + +RegisterNetEvent("esx:playerLoaded", checkPhone) + +AddEventHandler("onClientResourceStart", function(resource) + if resource ~= "npwd" then + return + end + + npwd = GetResourceState("npwd"):find("start") and exports.npwd or nil + + if ESX.PlayerLoaded then + checkPhone() + end +end) + +AddEventHandler("onClientResourceStop", function(resource) + if resource == "npwd" then + npwd = nil + end +end) + +RegisterNetEvent("esx:onPlayerLogout", function() + if not npwd then + return + end + + npwd:setPhoneVisible(false) + npwd:setPhoneDisabled(true) +end) + +RegisterNetEvent("esx:removeInventoryItem", function(item, count) + if not npwd then + return + end + + if item == "phone" and count == 0 then + npwd:setPhoneDisabled(true) + end +end) + +RegisterNetEvent("esx:addInventoryItem", function(item) + if not npwd or item ~= "phone" then + return + end + + npwd:setPhoneDisabled(false) +end) diff --git a/server-data/resources/[esx]/es_extended/common/functions.lua b/server-data/resources/[esx]/es_extended/common/functions.lua index 043396239..d3478f7f6 100644 --- a/server-data/resources/[esx]/es_extended/common/functions.lua +++ b/server-data/resources/[esx]/es_extended/common/functions.lua @@ -1,9 +1,13 @@ local Charset = {} -for _, range in ipairs({ { 48, 57 }, { 65, 90 }, { 97, 122 } }) do - for i = range[1], range[2] do - Charset[#Charset + 1] = string.char(i) - end +for i = 48, 57 do + table.insert(Charset, string.char(i)) +end +for i = 65, 90 do + table.insert(Charset, string.char(i)) +end +for i = 97, 122 do + table.insert(Charset, string.char(i)) end local weaponsByName = {} diff --git a/server-data/resources/[esx]/es_extended/common/modules/math.lua b/server-data/resources/[esx]/es_extended/common/modules/math.lua index 4e2c71159..e620d48a9 100644 --- a/server-data/resources/[esx]/es_extended/common/modules/math.lua +++ b/server-data/resources/[esx]/es_extended/common/modules/math.lua @@ -13,7 +13,9 @@ end function ESX.Math.GroupDigits(value) local left, num, right = string.match(value, "^([^%d]*%d)(%d*)(.-)$") - return left .. (num:reverse():gsub("(%d%d%d)", "%1" .. _U("locale_digit_grouping_symbol")):reverse()) .. right + return left + .. (num:reverse():gsub("(%d%d%d)", "%1" .. TranslateCap("locale_digit_grouping_symbol")):reverse()) + .. right end function ESX.Math.Trim(value) diff --git a/server-data/resources/[esx]/es_extended/common/modules/table.lua b/server-data/resources/[esx]/es_extended/common/modules/table.lua index 7aac3ca40..957cb68c8 100644 --- a/server-data/resources/[esx]/es_extended/common/modules/table.lua +++ b/server-data/resources/[esx]/es_extended/common/modules/table.lua @@ -136,6 +136,25 @@ function ESX.Table.Join(t, sep) return str end +-- Credits: https://github.com/JonasDev99/qb-garages/blob/b0335d67cb72a6b9ac60f62a87fb3946f5c2f33d/server/main.lua#L5 +function ESX.Table.TableContains(tab, val) + if type(val) == "table" then + for _, value in pairs(tab) do + if ESX.Table.TableContains(val, value) then + return true + end + end + return false + else + for _, value in pairs(tab) do + if value == val then + return true + end + end + end + return false +end + -- Credit: https://stackoverflow.com/a/15706820 -- Description: sort function for pairs function ESX.Table.Sort(t, order) diff --git a/server-data/resources/[esx]/es_extended/common/modules/timeout.lua b/server-data/resources/[esx]/es_extended/common/modules/timeout.lua new file mode 100644 index 000000000..814b086ce --- /dev/null +++ b/server-data/resources/[esx]/es_extended/common/modules/timeout.lua @@ -0,0 +1,23 @@ +local TimeoutCount = 0 +local CancelledTimeouts = {} + +ESX.SetTimeout = function(msec, cb) + local id = TimeoutCount + 1 + + SetTimeout(msec, function() + if CancelledTimeouts[id] then + CancelledTimeouts[id] = nil + return + end + + cb() + end) + + TimeoutCount = id + + return id +end + +ESX.ClearTimeout = function(id) + CancelledTimeouts[id] = true +end diff --git a/server-data/resources/[esx]/es_extended/config.logs.lua b/server-data/resources/[esx]/es_extended/config.logs.lua new file mode 100644 index 000000000..92cdfc3ae --- /dev/null +++ b/server-data/resources/[esx]/es_extended/config.logs.lua @@ -0,0 +1,23 @@ +Config.DiscordLogs = { + Webhooks = { + default = "", + test = "", + Chat = "", + UserActions = "", + Resources = "", + Paycheck = "", + }, + + Colors = { -- https://www.spycolor.com/ + default = 14423100, + blue = 255, + red = 16711680, + green = 65280, + white = 16777215, + black = 0, + orange = 16744192, + yellow = 16776960, + pink = 16761035, + lightgreen = 65309, + }, +} diff --git a/server-data/resources/[esx]/es_extended/config.lua b/server-data/resources/[esx]/es_extended/config.lua index 91013fca1..45b4c9fe7 100644 --- a/server-data/resources/[esx]/es_extended/config.lua +++ b/server-data/resources/[esx]/es_extended/config.lua @@ -1,64 +1,93 @@ Config = {} -Config.Locale = "en" +Config.Locale = GetConvar("esx:locale", "en") + +Config.OxInventory = GetResourceState("ox_inventory") ~= "missing" Config.Accounts = { bank = { - label = _U("account_bank"), + label = TranslateCap("account_bank"), round = true, }, black_money = { - label = _U("account_black_money"), + label = TranslateCap("account_black_money"), round = true, }, money = { - label = _U("account_money"), + label = TranslateCap("account_money"), round = true, }, } Config.StartingAccountMoney = { bank = 50000 } -Config.EnableSocietyPayouts = true -- pay from the society account that the player is employed at? Requirement: esx_society + +Config.StartingInventoryItems = false -- table/false + +Config.DefaultSpawns = + { -- If you want to have more spawn positions and select them randomly uncomment commented code or add more locations + { x = 222.2027, y = -864.0162, z = 30.2922, heading = 1.0 }, + --{x = 224.9865, y = -865.0871, z = 30.2922, heading = 1.0}, + --{x = 227.8436, y = -866.0400, z = 30.2922, heading = 1.0}, + --{x = 230.6051, y = -867.1450, z = 30.2922, heading = 1.0}, + --{x = 233.5459, y = -868.2626, z = 30.2922, heading = 1.0} + } + +Config.AdminGroups = { + ["owner"] = true, + ["admin"] = true, +} + +Config.EnablePaycheck = true -- enable paycheck +Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via webhook (default is false) +Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society Config.MaxWeight = 24 -- the max inventory weight without backpack Config.PaycheckInterval = 7 * 60000 -- how often to recieve pay checks in milliseconds Config.EnableDebug = false -- Use Debug options? +Config.EnableDefaultInventory = true -- Display the default Inventory ( F2 ) Config.EnableWantedLevel = false -- Use Normal GTA wanted Level? Config.EnablePVP = true -- Allow Player to player combat -Config.Multichar = true -- Enable support for esx_multicharacter + +Config.Multichar = GetResourceState("esx_multicharacter") ~= "missing" Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. + +Config.AdminLogging = false -- Logs the usage of certain commands by those with group.admin ace permissions (default is false) + Config.DisableHealthRegeneration = false -- Player will no longer regenerate health Config.DisableVehicleRewards = false -- Disables Player Recieving weapons from vehicles -Config.DisableNPCDrops = true -- stops NPCs from dropping weapons on death +Config.DisableNPCDrops = false -- stops NPCs from dropping weapons on death +Config.DisableDispatchServices = false -- Disable Dispatch services +Config.DisableScenarios = false -- Disable Scenarios Config.DisableWeaponWheel = false -- Disables default weapon wheel Config.DisableAimAssist = false -- disables AIM assist (mainly on controllers) +Config.DisableVehicleSeatShuff = false -- Disables vehicle seat shuff Config.DisableDisplayAmmo = false -- Disable ammunition display Config.RemoveHudComponents = { - [1] = false, -- WANTED_STARS, - [2] = false, -- WEAPON_ICON - [3] = false, -- CASH - [4] = false, -- MP_CASH - [5] = false, -- MP_MESSAGE - [6] = false, -- VEHICLE_NAME + [1] = false, --WANTED_STARS, + [2] = false, --WEAPON_ICON + [3] = false, --CASH + [4] = false, --MP_CASH + [5] = false, --MP_MESSAGE + [6] = false, --VEHICLE_NAME [7] = false, -- AREA_NAME [8] = false, -- VEHICLE_CLASS - [9] = false, -- STREET_NAME - [10] = false, -- HELP_TEXT - [11] = false, -- FLOATING_HELP_TEXT_1 - [12] = false, -- FLOATING_HELP_TEXT_2 - [13] = false, -- CASH_CHANGE - [14] = false, -- RETICLE - [15] = false, -- SUBTITLE_TEXT - [16] = false, -- RADIO_STATIONS - [17] = false, -- SAVING_GAME, - [18] = false, -- GAME_STREAM - [19] = false, -- WEAPON_WHEEL - [20] = false, -- WEAPON_WHEEL_STATS - [21] = false, -- HUD_COMPONENTS - [22] = false, -- HUD_WEAPONS + [9] = false, --STREET_NAME + [10] = false, --HELP_TEXT + [11] = false, --FLOATING_HELP_TEXT_1 + [12] = false, --FLOATING_HELP_TEXT_2 + [13] = false, --CASH_CHANGE + [14] = false, --RETICLE + [15] = false, --SUBTITLE_TEXT + [16] = false, --RADIO_STATIONS + [17] = false, --SAVING_GAME, + [18] = false, --GAME_STREAM + [19] = false, --WEAPON_WHEEL + [20] = false, --WEAPON_WHEEL_STATS + [21] = false, --HUD_COMPONENTS + [22] = false, --HUD_WEAPONS } -Config.MaxAdminVehicles = true -- admin vehicles spawn with max vehcle settings -Config.CustomAIPlates = "BPT.A111" -- Custom plates for AI vehicles +Config.SpawnVehMaxUpgrades = true -- admin vehicles spawn with max vehcle settings +Config.CustomAIPlates = "........" -- Custom plates for AI vehicles -- Pattern string format --1 will lead to a random number from 0-9. --A will lead to a random letter from A-Z. diff --git a/server-data/resources/[esx]/es_extended/config.weapons.lua b/server-data/resources/[esx]/es_extended/config.weapons.lua index ea4d5bfbf..0dbdb5203 100644 --- a/server-data/resources/[esx]/es_extended/config.weapons.lua +++ b/server-data/resources/[esx]/es_extended/config.weapons.lua @@ -1,76 +1,104 @@ Config.DefaultWeaponTints = { - [0] = _U("tint_default"), - [1] = _U("tint_green"), - [2] = _U("tint_gold"), - [3] = _U("tint_pink"), - [4] = _U("tint_army"), - [5] = _U("tint_lspd"), - [6] = _U("tint_orange"), - [7] = _U("tint_platinum"), + [0] = TranslateCap("tint_default"), + [1] = TranslateCap("tint_green"), + [2] = TranslateCap("tint_gold"), + [3] = TranslateCap("tint_pink"), + [4] = TranslateCap("tint_army"), + [5] = TranslateCap("tint_lspd"), + [6] = TranslateCap("tint_orange"), + [7] = TranslateCap("tint_platinum"), } Config.Weapons = { -- Melee - { name = "WEAPON_DAGGER", label = _U("weapon_dagger"), components = {} }, - { name = "WEAPON_BAT", label = _U("weapon_bat"), components = {} }, - { name = "WEAPON_BATTLEAXE", label = _U("weapon_battleaxe"), components = {} }, + { name = "WEAPON_DAGGER", label = TranslateCap("weapon_dagger"), components = {} }, + { name = "WEAPON_BAT", label = TranslateCap("weapon_bat"), components = {} }, + { name = "WEAPON_BATTLEAXE", label = TranslateCap("weapon_battleaxe"), components = {} }, { name = "WEAPON_KNUCKLE", - label = _U("weapon_knuckle"), + label = TranslateCap("weapon_knuckle"), components = { - { name = "knuckle_base", label = _U("component_knuckle_base"), hash = `COMPONENT_KNUCKLE_VARMOD_BASE` }, - { name = "knuckle_pimp", label = _U("component_knuckle_pimp"), hash = `COMPONENT_KNUCKLE_VARMOD_PIMP` }, + { + name = "knuckle_base", + label = TranslateCap("component_knuckle_base"), + hash = `COMPONENT_KNUCKLE_VARMOD_BASE`, + }, + { + name = "knuckle_pimp", + label = TranslateCap("component_knuckle_pimp"), + hash = `COMPONENT_KNUCKLE_VARMOD_PIMP`, + }, { name = "knuckle_ballas", - label = _U("component_knuckle_ballas"), + label = TranslateCap("component_knuckle_ballas"), hash = `COMPONENT_KNUCKLE_VARMOD_BALLAS`, }, { name = "knuckle_dollar", - label = _U("component_knuckle_dollar"), + label = TranslateCap("component_knuckle_dollar"), hash = `COMPONENT_KNUCKLE_VARMOD_DOLLAR`, }, { name = "knuckle_diamond", - label = _U("component_knuckle_diamond"), + label = TranslateCap("component_knuckle_diamond"), hash = `COMPONENT_KNUCKLE_VARMOD_DIAMOND`, }, - { name = "knuckle_hate", label = _U("component_knuckle_hate"), hash = `COMPONENT_KNUCKLE_VARMOD_HATE` }, - { name = "knuckle_love", label = _U("component_knuckle_love"), hash = `COMPONENT_KNUCKLE_VARMOD_LOVE` }, + { + name = "knuckle_hate", + label = TranslateCap("component_knuckle_hate"), + hash = `COMPONENT_KNUCKLE_VARMOD_HATE`, + }, + { + name = "knuckle_love", + label = TranslateCap("component_knuckle_love"), + hash = `COMPONENT_KNUCKLE_VARMOD_LOVE`, + }, { name = "knuckle_player", - label = _U("component_knuckle_player"), + label = TranslateCap("component_knuckle_player"), hash = `COMPONENT_KNUCKLE_VARMOD_PLAYER`, }, - { name = "knuckle_king", label = _U("component_knuckle_king"), hash = `COMPONENT_KNUCKLE_VARMOD_KING` }, - { name = "knuckle_vagos", label = _U("component_knuckle_vagos"), hash = `COMPONENT_KNUCKLE_VARMOD_VAGOS` }, + { + name = "knuckle_king", + label = TranslateCap("component_knuckle_king"), + hash = `COMPONENT_KNUCKLE_VARMOD_KING`, + }, + { + name = "knuckle_vagos", + label = TranslateCap("component_knuckle_vagos"), + hash = `COMPONENT_KNUCKLE_VARMOD_VAGOS`, + }, }, }, - { name = "WEAPON_BOTTLE", label = _U("weapon_bottle"), components = {} }, - { name = "WEAPON_CROWBAR", label = _U("weapon_crowbar"), components = {} }, - { name = "WEAPON_FLASHLIGHT", label = _U("weapon_flashlight"), components = {} }, - { name = "WEAPON_GOLFCLUB", label = _U("weapon_golfclub"), components = {} }, - { name = "WEAPON_HAMMER", label = _U("weapon_hammer"), components = {} }, - { name = "WEAPON_HATCHET", label = _U("weapon_hatchet"), components = {} }, - { name = "WEAPON_KNIFE", label = _U("weapon_knife"), components = {} }, - { name = "WEAPON_MACHETE", label = _U("weapon_machete"), components = {} }, - { name = "WEAPON_NIGHTSTICK", label = _U("weapon_nightstick"), components = {} }, - { name = "WEAPON_WRENCH", label = _U("weapon_wrench"), components = {} }, - { name = "WEAPON_POOLCUE", label = _U("weapon_poolcue"), components = {} }, - { name = "WEAPON_STONE_HATCHET", label = _U("weapon_stone_hatchet"), components = {} }, + { name = "WEAPON_BOTTLE", label = TranslateCap("weapon_bottle"), components = {} }, + { name = "WEAPON_CROWBAR", label = TranslateCap("weapon_crowbar"), components = {} }, + { name = "WEAPON_FLASHLIGHT", label = TranslateCap("weapon_flashlight"), components = {} }, + { name = "WEAPON_GOLFCLUB", label = TranslateCap("weapon_golfclub"), components = {} }, + { name = "WEAPON_HAMMER", label = TranslateCap("weapon_hammer"), components = {} }, + { name = "WEAPON_HATCHET", label = TranslateCap("weapon_hatchet"), components = {} }, + { name = "WEAPON_KNIFE", label = TranslateCap("weapon_knife"), components = {} }, + { name = "WEAPON_MACHETE", label = TranslateCap("weapon_machete"), components = {} }, + { name = "WEAPON_NIGHTSTICK", label = TranslateCap("weapon_nightstick"), components = {} }, + { name = "WEAPON_WRENCH", label = TranslateCap("weapon_wrench"), components = {} }, + { name = "WEAPON_POOLCUE", label = TranslateCap("weapon_poolcue"), components = {} }, + { name = "WEAPON_STONE_HATCHET", label = TranslateCap("weapon_stone_hatchet"), components = {} }, { name = "WEAPON_SWITCHBLADE", - label = _U("weapon_switchblade"), + label = TranslateCap("weapon_switchblade"), components = { { name = "handle_default", - label = _U("component_handle_default"), + label = TranslateCap("component_handle_default"), hash = `COMPONENT_SWITCHBLADE_VARMOD_BASE`, }, - { name = "handle_vip", label = _U("component_handle_vip"), hash = `COMPONENT_SWITCHBLADE_VARMOD_VAR1` }, + { + name = "handle_vip", + label = TranslateCap("component_handle_vip"), + hash = `COMPONENT_SWITCHBLADE_VARMOD_VAR1`, + }, { name = "handle_bodyguard", - label = _U("component_handle_bodyguard"), + label = TranslateCap("component_handle_bodyguard"), hash = `COMPONENT_SWITCHBLADE_VARMOD_VAR2`, }, }, @@ -78,550 +106,852 @@ Config.Weapons = { -- Handguns { name = "WEAPON_APPISTOL", - label = _U("weapon_appistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_appistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_APPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_APPISTOL_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_APPISTOL_VARMOD_LUXE` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_APPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_APPISTOL_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_APPISTOL_VARMOD_LUXE`, + }, }, }, { name = "WEAPON_CERAMICPISTOL", - label = _U("weapon_ceramicpistol"), + label = TranslateCap("weapon_ceramicpistol"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, }, { name = "WEAPON_COMBATPISTOL", - label = _U("weapon_combatpistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_combatpistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_COMBATPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_COMBATPISTOL_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_COMBATPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_COMBATPISTOL_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_COMBATPISTOL_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_DOUBLEACTION", - label = _U("weapon_doubleaction"), + label = TranslateCap("weapon_doubleaction"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, }, { name = "WEAPON_NAVYREVOLVER", - label = _U("weapon_navyrevolver"), + label = TranslateCap("weapon_navyrevolver"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, }, { name = "WEAPON_FLAREGUN", - label = _U("weapon_flaregun"), + label = TranslateCap("weapon_flaregun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_flaregun"), hash = `AMMO_FLAREGUN` }, + ammo = { label = TranslateCap("ammo_flaregun"), hash = `AMMO_FLAREGUN` }, }, { name = "WEAPON_GADGETPISTOL", - label = _U("weapon_gadgetpistol"), + label = TranslateCap("weapon_gadgetpistol"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, }, { name = "WEAPON_HEAVYPISTOL", - label = _U("weapon_heavypistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_heavypistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_HEAVYPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_HEAVYPISTOL_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_HEAVYPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_HEAVYPISTOL_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_HEAVYPISTOL_VARMOD_LUXE`, }, }, }, { name = "WEAPON_REVOLVER", - label = _U("weapon_revolver"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_revolver"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_REVOLVER_CLIP_01` }, - { name = "vip_finish", label = _U("component_vip_finish"), hash = `COMPONENT_REVOLVER_VARMOD_BOSS` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_REVOLVER_CLIP_01`, + }, + { + name = "vip_finish", + label = TranslateCap("component_vip_finish"), + hash = `COMPONENT_REVOLVER_VARMOD_BOSS`, + }, { name = "bodyguard_finish", - label = _U("component_bodyguard_finish"), + label = TranslateCap("component_bodyguard_finish"), hash = `COMPONENT_REVOLVER_VARMOD_GOON`, }, }, }, { name = "WEAPON_REVOLVER_MK2", - label = _U("weapon_revolver_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_revolver_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_REVOLVER_MK2_CLIP_01` }, - { name = "ammo_tracer", label = _U("component_ammo_tracer"), hash = `COMPONENT_REVOLVER_MK2_CLIP_TRACER` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_REVOLVER_MK2_CLIP_01`, + }, + { + name = "ammo_tracer", + label = TranslateCap("component_ammo_tracer"), + hash = `COMPONENT_REVOLVER_MK2_CLIP_TRACER`, + }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_REVOLVER_MK2_CLIP_INCENDIARY`, }, { name = "ammo_hollowpoint", - label = _U("component_ammo_hollowpoint"), + label = TranslateCap("component_ammo_hollowpoint"), hash = `COMPONENT_REVOLVER_MK2_CLIP_HOLLOWPOINT`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_REVOLVER_MK2_CLIP_FMJ` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_small", label = _U("component_ammo_fmj"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "compensator", label = _U("component_compensator"), hash = `COMPONENT_AT_PI_COMP_03` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_REVOLVER_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_REVOLVER_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_REVOLVER_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_REVOLVER_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_REVOLVER_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_REVOLVER_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_REVOLVER_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_REVOLVER_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_REVOLVER_MK2_CAMO_09` }, - { name = "camo_finish10", label = _U("component_camo_finish10"), hash = `COMPONENT_REVOLVER_MK2_CAMO_10` }, + { name = "ammo_fmj", label = TranslateCap("component_ammo_fmj"), hash = `COMPONENT_REVOLVER_MK2_CLIP_FMJ` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { name = "scope_small", label = TranslateCap("component_ammo_fmj"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "compensator", label = TranslateCap("component_compensator"), hash = `COMPONENT_AT_PI_COMP_03` }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_REVOLVER_MK2_CAMO`, + }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_09`, + }, + { + name = "camo_finish10", + label = TranslateCap("component_camo_finish10"), + hash = `COMPONENT_REVOLVER_MK2_CAMO_10`, + }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_REVOLVER_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_MARKSMANPISTOL", - label = _U("weapon_marksmanpistol"), + label = TranslateCap("weapon_marksmanpistol"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, }, { name = "WEAPON_PISTOL", - label = _U("weapon_pistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_pistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_PISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_PISTOL_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_PISTOL_VARMOD_LUXE` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_PISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_PISTOL_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_PISTOL_VARMOD_LUXE`, + }, }, }, { name = "WEAPON_PISTOL_MK2", - label = _U("weapon_pistol_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_pistol_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_PISTOL_MK2_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_PISTOL_MK2_CLIP_02` }, - { name = "ammo_tracer", label = _U("component_ammo_tracer"), hash = `COMPONENT_PISTOL_MK2_CLIP_TRACER` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_PISTOL_MK2_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_PISTOL_MK2_CLIP_02`, + }, + { + name = "ammo_tracer", + label = TranslateCap("component_ammo_tracer"), + hash = `COMPONENT_PISTOL_MK2_CLIP_TRACER`, + }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_PISTOL_MK2_CLIP_INCENDIARY`, }, { name = "ammo_hollowpoint", - label = _U("component_ammo_hollowpoint"), + label = TranslateCap("component_ammo_hollowpoint"), hash = `COMPONENT_PISTOL_MK2_CLIP_HOLLOWPOINT`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_PISTOL_MK2_CLIP_FMJ` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_PI_RAIL` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH_02` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, - { name = "compensator", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_COMP` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_PISTOL_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_PISTOL_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_PISTOL_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_PISTOL_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_PISTOL_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_PISTOL_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_PISTOL_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_PISTOL_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_PISTOL_MK2_CAMO_09` }, - { name = "camo_finish10", label = _U("component_camo_finish10"), hash = `COMPONENT_PISTOL_MK2_CAMO_10` }, + { name = "ammo_fmj", label = TranslateCap("component_ammo_fmj"), hash = `COMPONENT_PISTOL_MK2_CLIP_FMJ` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_PI_RAIL` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH_02` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, + { name = "compensator", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_COMP` }, + { name = "camo_finish", label = TranslateCap("component_camo_finish"), hash = `COMPONENT_PISTOL_MK2_CAMO` }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_PISTOL_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_PISTOL_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_PISTOL_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_PISTOL_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_PISTOL_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_PISTOL_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_PISTOL_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_PISTOL_MK2_CAMO_09`, + }, + { + name = "camo_finish10", + label = TranslateCap("component_camo_finish10"), + hash = `COMPONENT_PISTOL_MK2_CAMO_10`, + }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_PISTOL_MK2_CAMO_IND_01`, }, { name = "camo_slide_finish", - label = _U("component_camo_slide_finish"), + label = TranslateCap("component_camo_slide_finish"), hash = `COMPONENT_PISTOL_MK2_CAMO_SLIDE`, }, { name = "camo_slide_finish2", - label = _U("component_camo_slide_finish2"), + label = TranslateCap("component_camo_slide_finish2"), hash = `COMPONENT_PISTOL_MK2_CAMO_02_SLIDE`, }, { name = "camo_slide_finish3", - label = _U("component_camo_slide_finish3"), + label = TranslateCap("component_camo_slide_finish3"), hash = `COMPONENT_PISTOL_MK2_CAMO_03_SLIDE`, }, { name = "camo_slide_finish4", - label = _U("component_camo_slide_finish4"), + label = TranslateCap("component_camo_slide_finish4"), hash = `COMPONENT_PISTOL_MK2_CAMO_04_SLIDE`, }, { name = "camo_slide_finish5", - label = _U("component_camo_slide_finish5"), + label = TranslateCap("component_camo_slide_finish5"), hash = `COMPONENT_PISTOL_MK2_CAMO_05_SLIDE`, }, { name = "camo_slide_finish6", - label = _U("component_camo_slide_finish6"), + label = TranslateCap("component_camo_slide_finish6"), hash = `COMPONENT_PISTOL_MK2_CAMO_06_SLIDE`, }, { name = "camo_slide_finish7", - label = _U("component_camo_slide_finish7"), + label = TranslateCap("component_camo_slide_finish7"), hash = `COMPONENT_PISTOL_MK2_CAMO_07_SLIDE`, }, { name = "camo_slide_finish8", - label = _U("component_camo_slide_finish8"), + label = TranslateCap("component_camo_slide_finish8"), hash = `COMPONENT_PISTOL_MK2_CAMO_08_SLIDE`, }, { name = "camo_slide_finish9", - label = _U("component_camo_slide_finish9"), + label = TranslateCap("component_camo_slide_finish9"), hash = `COMPONENT_PISTOL_MK2_CAMO_09_SLIDE`, }, { name = "camo_slide_finish10", - label = _U("component_camo_slide_finish10"), + label = TranslateCap("component_camo_slide_finish10"), hash = `COMPONENT_PISTOL_MK2_CAMO_10_SLIDE`, }, { name = "camo_slide_finish11", - label = _U("component_camo_slide_finish11"), + label = TranslateCap("component_camo_slide_finish11"), hash = `COMPONENT_PISTOL_MK2_CAMO_IND_01_SLIDE`, }, }, }, { name = "WEAPON_PISTOL50", - label = _U("weapon_pistol50"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_pistol50"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_PISTOL50_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_PISTOL50_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_PISTOL50_VARMOD_LUXE` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_PISTOL50_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_PISTOL50_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_PISTOL50_VARMOD_LUXE`, + }, }, }, { name = "WEAPON_SNSPISTOL", - label = _U("weapon_snspistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_snspistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_SNSPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_SNSPISTOL_CLIP_02` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_SNSPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_SNSPISTOL_CLIP_02`, + }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_SNSPISTOL_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_SNSPISTOL_MK2", - label = _U("weapon_snspistol_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_snspistol_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_02` }, - { name = "ammo_tracer", label = _U("component_ammo_tracer"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_TRACER` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_SNSPISTOL_MK2_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_SNSPISTOL_MK2_CLIP_02`, + }, + { + name = "ammo_tracer", + label = TranslateCap("component_ammo_tracer"), + hash = `COMPONENT_SNSPISTOL_MK2_CLIP_TRACER`, + }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_INCENDIARY`, }, { name = "ammo_hollowpoint", - label = _U("component_ammo_hollowpoint"), + label = TranslateCap("component_ammo_hollowpoint"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_HOLLOWPOINT`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_FMJ` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_PI_RAIL_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH_03` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, - { name = "compensator", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_COMP_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_09` }, - { name = "camo_finish10", label = _U("component_camo_finish10"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_10` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_SNSPISTOL_MK2_CLIP_FMJ`, + }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_PI_RAIL_02` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH_03` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP_02` }, + { name = "compensator", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_COMP_02` }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO`, + }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_09`, + }, + { + name = "camo_finish10", + label = TranslateCap("component_camo_finish10"), + hash = `COMPONENT_SNSPISTOL_MK2_CAMO_10`, + }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_IND_01`, }, { name = "camo_slide_finish", - label = _U("component_camo_slide_finish"), + label = TranslateCap("component_camo_slide_finish"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_SLIDE`, }, { name = "camo_slide_finish2", - label = _U("component_camo_slide_finish2"), + label = TranslateCap("component_camo_slide_finish2"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_02_SLIDE`, }, { name = "camo_slide_finish3", - label = _U("component_camo_slide_finish3"), + label = TranslateCap("component_camo_slide_finish3"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_03_SLIDE`, }, { name = "camo_slide_finish4", - label = _U("component_camo_slide_finish4"), + label = TranslateCap("component_camo_slide_finish4"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_04_SLIDE`, }, { name = "camo_slide_finish5", - label = _U("component_camo_slide_finish5"), + label = TranslateCap("component_camo_slide_finish5"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_05_SLIDE`, }, { name = "camo_slide_finish6", - label = _U("component_camo_slide_finish6"), + label = TranslateCap("component_camo_slide_finish6"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_06_SLIDE`, }, { name = "camo_slide_finish7", - label = _U("component_camo_slide_finish7"), + label = TranslateCap("component_camo_slide_finish7"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_07_SLIDE`, }, { name = "camo_slide_finish8", - label = _U("component_camo_slide_finish8"), + label = TranslateCap("component_camo_slide_finish8"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_08_SLIDE`, }, { name = "camo_slide_finish9", - label = _U("component_camo_slide_finish9"), + label = TranslateCap("component_camo_slide_finish9"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_09_SLIDE`, }, { name = "camo_slide_finish10", - label = _U("component_camo_slide_finish10"), + label = TranslateCap("component_camo_slide_finish10"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_10_SLIDE`, }, { name = "camo_slide_finish11", - label = _U("component_camo_slide_finish11"), + label = TranslateCap("component_camo_slide_finish11"), hash = `COMPONENT_SNSPISTOL_MK2_CAMO_IND_01_SLIDE`, }, }, }, - { name = "WEAPON_STUNGUN", label = _U("weapon_stungun"), tints = Config.DefaultWeaponTints, components = {} }, - { name = "WEAPON_RAYPISTOL", label = _U("weapon_raypistol"), tints = Config.DefaultWeaponTints, components = {} }, + { + name = "WEAPON_STUNGUN", + label = TranslateCap("weapon_stungun"), + tints = Config.DefaultWeaponTints, + components = {}, + }, + { + name = "WEAPON_RAYPISTOL", + label = TranslateCap("weapon_raypistol"), + tints = Config.DefaultWeaponTints, + components = {}, + }, { name = "WEAPON_VINTAGEPISTOL", - label = _U("weapon_vintagepistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_vintagepistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_VINTAGEPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_VINTAGEPISTOL_CLIP_02` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_VINTAGEPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_VINTAGEPISTOL_CLIP_02`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, }, }, -- Shotguns { name = "WEAPON_ASSAULTSHOTGUN", - label = _U("weapon_assaultshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_assaultshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_ASSAULTSHOTGUN_CLIP_01` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_ASSAULTSHOTGUN_CLIP_01`, + }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_ASSAULTSHOTGUN_CLIP_02`, }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, }, }, { name = "WEAPON_AUTOSHOTGUN", - label = _U("weapon_autoshotgun"), + label = TranslateCap("weapon_autoshotgun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, }, { name = "WEAPON_BULLPUPSHOTGUN", - label = _U("weapon_bullpupshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_bullpupshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, }, }, { name = "WEAPON_COMBATSHOTGUN", - label = _U("weapon_combatshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_combatshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, }, }, { name = "WEAPON_DBSHOTGUN", - label = _U("weapon_dbshotgun"), + label = TranslateCap("weapon_dbshotgun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, }, { name = "WEAPON_HEAVYSHOTGUN", - label = _U("weapon_heavyshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_heavyshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_HEAVYSHOTGUN_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_HEAVYSHOTGUN_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_HEAVYSHOTGUN_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_HEAVYSHOTGUN_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_HEAVYSHOTGUN_CLIP_02`, + }, + { + name = "clip_drum", + label = TranslateCap("component_clip_drum"), + hash = `COMPONENT_HEAVYSHOTGUN_CLIP_03`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, }, }, { name = "WEAPON_MUSKET", - label = _U("weapon_musket"), + label = TranslateCap("weapon_musket"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SHOTGUN` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SHOTGUN` }, }, { name = "WEAPON_PUMPSHOTGUN", - label = _U("weapon_pumpshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_pumpshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_PUMPSHOTGUN_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_PUMPSHOTGUN_MK2", - label = _U("weapon_pumpshotgun_mk2"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_pumpshotgun_mk2"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { { name = "shells_default", - label = _U("component_shells_default"), + label = TranslateCap("component_shells_default"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_01`, }, { name = "shells_incendiary", - label = _U("component_shells_incendiary"), + label = TranslateCap("component_shells_incendiary"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_INCENDIARY`, }, { name = "shells_armor", - label = _U("component_shells_armor"), + label = TranslateCap("component_shells_armor"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_ARMORPIERCING`, }, { name = "shells_hollowpoint", - label = _U("component_shells_hollowpoint"), + label = TranslateCap("component_shells_hollowpoint"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_HOLLOWPOINT`, }, { name = "shells_explosive", - label = _U("component_shells_explosive"), + label = TranslateCap("component_shells_explosive"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_EXPLOSIVE`, }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_small", label = _U("component_scope_small"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, - { name = "scope_medium", label = _U("component_scope_medium"), hash = `COMPONENT_AT_SCOPE_SMALL_MK2` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP_03` }, - { name = "muzzle_squared", label = _U("component_muzzle_squared"), hash = `COMPONENT_AT_MUZZLE_08` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_09` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_small", + label = TranslateCap("component_scope_small"), + hash = `COMPONENT_AT_SCOPE_MACRO_MK2`, + }, + { + name = "scope_medium", + label = TranslateCap("component_scope_medium"), + hash = `COMPONENT_AT_SCOPE_SMALL_MK2`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP_03` }, + { + name = "muzzle_squared", + label = TranslateCap("component_muzzle_squared"), + hash = `COMPONENT_AT_MUZZLE_08`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO`, + }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_09`, + }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_SAWNOFFSHOTGUN", - label = _U("weapon_sawnoffshotgun"), - ammo = { label = _U("ammo_shells"), hash = `AMMO_SHOTGUN` }, + label = TranslateCap("weapon_sawnoffshotgun"), + ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` }, tints = Config.DefaultWeaponTints, components = { { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_SAWNOFFSHOTGUN_VARMOD_LUXE`, }, }, @@ -629,961 +959,1552 @@ Config.Weapons = { -- SMG & LMG { name = "WEAPON_ASSAULTSMG", - label = _U("weapon_assaultsmg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_assaultsmg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_ASSAULTSMG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_ASSAULTSMG_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_ASSAULTSMG_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_ASSAULTSMG_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_ASSAULTSMG_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_COMBATMG", - label = _U("weapon_combatmg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MG` }, + label = TranslateCap("weapon_combatmg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_COMBATMG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_COMBATMG_CLIP_02` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_COMBATMG_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_COMBATMG_CLIP_02`, + }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_COMBATMG_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_COMBATMG_MK2", - label = _U("weapon_combatmg_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MG` }, + label = TranslateCap("weapon_combatmg_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_COMBATMG_MK2_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_COMBATMG_MK2_CLIP_02` }, - { name = "ammo_tracer", label = _U("component_ammo_tracer"), hash = `COMPONENT_COMBATMG_MK2_CLIP_TRACER` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_COMBATMG_MK2_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_COMBATMG_MK2_CLIP_02`, + }, + { + name = "ammo_tracer", + label = TranslateCap("component_ammo_tracer"), + hash = `COMPONENT_COMBATMG_MK2_CLIP_TRACER`, + }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_COMBATMG_MK2_CLIP_INCENDIARY`, }, { name = "ammo_hollowpoint", - label = _U("component_ammo_hollowpoint"), + label = TranslateCap("component_ammo_hollowpoint"), hash = `COMPONENT_COMBATMG_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_COMBATMG_MK2_CLIP_FMJ` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_medium", label = _U("component_scope_medium"), hash = `COMPONENT_AT_SCOPE_SMALL_MK2` }, - { name = "scope_large", label = _U("component_scope_large"), hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_MG_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_MG_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_COMBATMG_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_COMBATMG_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_COMBATMG_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_COMBATMG_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_COMBATMG_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_COMBATMG_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_COMBATMG_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_COMBATMG_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_COMBATMG_MK2_CAMO_09` }, - { name = "camo_finish10", label = _U("component_camo_finish10"), hash = `COMPONENT_COMBATMG_MK2_CAMO_10` }, + { name = "ammo_fmj", label = TranslateCap("component_ammo_fmj"), hash = `COMPONENT_COMBATMG_MK2_CLIP_FMJ` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_medium", + label = TranslateCap("component_scope_medium"), + hash = `COMPONENT_AT_SCOPE_SMALL_MK2`, + }, + { + name = "scope_large", + label = TranslateCap("component_scope_large"), + hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_MG_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_MG_BARREL_02`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_COMBATMG_MK2_CAMO`, + }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_09`, + }, + { + name = "camo_finish10", + label = TranslateCap("component_camo_finish10"), + hash = `COMPONENT_COMBATMG_MK2_CAMO_10`, + }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_COMBATMG_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_COMBATPDW", - label = _U("weapon_combatpdw"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_combatpdw"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_COMBATPDW_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_COMBATPDW_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_COMBATPDW_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_COMBATPDW_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_COMBATPDW_CLIP_02`, + }, + { name = "clip_drum", label = TranslateCap("component_clip_drum"), hash = `COMPONENT_COMBATPDW_CLIP_03` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, }, }, { name = "WEAPON_GUSENBERG", - label = _U("weapon_gusenberg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MG` }, + label = TranslateCap("weapon_gusenberg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_GUSENBERG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_GUSENBERG_CLIP_02` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_GUSENBERG_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_GUSENBERG_CLIP_02`, + }, }, }, { name = "WEAPON_MACHINEPISTOL", - label = _U("weapon_machinepistol"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_PISTOL` }, + label = TranslateCap("weapon_machinepistol"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MACHINEPISTOL_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MACHINEPISTOL_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_MACHINEPISTOL_CLIP_03` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_MACHINEPISTOL_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_MACHINEPISTOL_CLIP_02`, + }, + { + name = "clip_drum", + label = TranslateCap("component_clip_drum"), + hash = `COMPONENT_MACHINEPISTOL_CLIP_03`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, }, }, { name = "WEAPON_MG", - label = _U("weapon_mg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MG` }, + label = TranslateCap("weapon_mg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MG_CLIP_02` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL_02` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_MG_VARMOD_LOWRIDER` }, + { name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_MG_CLIP_01` }, + { name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_MG_CLIP_02` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL_02` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_MG_VARMOD_LOWRIDER`, + }, }, }, { name = "WEAPON_MICROSMG", - label = _U("weapon_microsmg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_microsmg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MICROSMG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MICROSMG_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_MICROSMG_VARMOD_LUXE` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_MICROSMG_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_MICROSMG_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_PI_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_MICROSMG_VARMOD_LUXE`, + }, }, }, { name = "WEAPON_MINISMG", - label = _U("weapon_minismg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_minismg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MINISMG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MINISMG_CLIP_02` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_MINISMG_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_MINISMG_CLIP_02`, + }, }, }, { name = "WEAPON_SMG", - label = _U("weapon_smg"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_smg"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_SMG_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_SMG_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_SMG_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO_02` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, - { name = "luxary_finish", label = _U("component_luxary_finish"), hash = `COMPONENT_SMG_VARMOD_LUXE` }, + { name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_SMG_CLIP_01` }, + { name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SMG_CLIP_02` }, + { name = "clip_drum", label = TranslateCap("component_clip_drum"), hash = `COMPONENT_SMG_CLIP_03` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO_02` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { + name = "luxary_finish", + label = TranslateCap("component_luxary_finish"), + hash = `COMPONENT_SMG_VARMOD_LUXE`, + }, }, }, { name = "WEAPON_SMG_MK2", - label = _U("weapon_smg_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_smg_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_SMG_MK2_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_SMG_MK2_CLIP_02` }, - { name = "ammo_tracer", label = _U("component_ammo_tracer"), hash = `COMPONENT_SMG_MK2_CLIP_TRACER` }, { - name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), - hash = `COMPONENT_SMG_MK2_CLIP_INCENDIARY`, + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_SMG_MK2_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_SMG_MK2_CLIP_02`, + }, + { + name = "ammo_tracer", + label = TranslateCap("component_ammo_tracer"), + hash = `COMPONENT_SMG_MK2_CLIP_TRACER`, + }, + { + name = "ammo_incendiary", + label = TranslateCap("component_ammo_incendiary"), + hash = `COMPONENT_SMG_MK2_CLIP_INCENDIARY`, + }, + { + name = "ammo_hollowpoint", + label = TranslateCap("component_ammo_hollowpoint"), + hash = `COMPONENT_SMG_MK2_CLIP_HOLLOWPOINT`, + }, + { name = "ammo_fmj", label = TranslateCap("component_ammo_fmj"), hash = `COMPONENT_SMG_MK2_CLIP_FMJ` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS_SMG` }, + { + name = "scope_small", + label = TranslateCap("component_scope_small"), + hash = `COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2`, + }, + { + name = "scope_medium", + label = TranslateCap("component_scope_medium"), + hash = `COMPONENT_AT_SCOPE_SMALL_SMG_MK2`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_SB_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_SB_BARREL_02`, + }, + { name = "camo_finish", label = TranslateCap("component_camo_finish"), hash = `COMPONENT_SMG_MK2_CAMO` }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_SMG_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_SMG_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_SMG_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_SMG_MK2_CAMO_05`, }, { - name = "ammo_hollowpoint", - label = _U("component_ammo_hollowpoint"), - hash = `COMPONENT_SMG_MK2_CLIP_HOLLOWPOINT`, + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_SMG_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_SMG_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_SMG_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_SMG_MK2_CAMO_09`, + }, + { + name = "camo_finish10", + label = TranslateCap("component_camo_finish10"), + hash = `COMPONENT_SMG_MK2_CAMO_10`, + }, + { + name = "camo_finish11", + label = TranslateCap("component_camo_finish11"), + hash = `COMPONENT_SMG_MK2_CAMO_IND_01`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_SMG_MK2_CLIP_FMJ` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS_SMG` }, - { name = "scope_small", label = _U("component_scope_small"), hash = `COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2` }, - { name = "scope_medium", label = _U("component_scope_medium"), hash = `COMPONENT_AT_SCOPE_SMALL_SMG_MK2` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_PI_SUPP` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_SB_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_SB_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_SMG_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_SMG_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_SMG_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_SMG_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_SMG_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_SMG_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_SMG_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_SMG_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_SMG_MK2_CAMO_09` }, - { name = "camo_finish10", label = _U("component_camo_finish10"), hash = `COMPONENT_SMG_MK2_CAMO_10` }, - { name = "camo_finish11", label = _U("component_camo_finish11"), hash = `COMPONENT_SMG_MK2_CAMO_IND_01` }, }, }, { name = "WEAPON_RAYCARBINE", - label = _U("weapon_raycarbine"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SMG` }, + label = TranslateCap("weapon_raycarbine"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` }, tints = Config.DefaultWeaponTints, components = {}, }, -- Rifles { name = "WEAPON_ADVANCEDRIFLE", - label = _U("weapon_advancedrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_advancedrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_ADVANCEDRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_ADVANCEDRIFLE_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_ADVANCEDRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_ADVANCEDRIFLE_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_ADVANCEDRIFLE_VARMOD_LUXE`, }, }, }, { name = "WEAPON_ASSAULTRIFLE", - label = _U("weapon_assaultrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_assaultrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_ASSAULTRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_ASSAULTRIFLE_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_ASSAULTRIFLE_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_ASSAULTRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_ASSAULTRIFLE_CLIP_02`, + }, + { + name = "clip_drum", + label = TranslateCap("component_clip_drum"), + hash = `COMPONENT_ASSAULTRIFLE_CLIP_03`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MACRO` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_ASSAULTRIFLE_VARMOD_LUXE`, }, }, }, { name = "WEAPON_ASSAULTRIFLE_MK2", - label = _U("weapon_assaultrifle_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_assaultrifle_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { { name = "clip_default", - label = _U("component_clip_default"), + label = TranslateCap("component_clip_default"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_01`, }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_02`, }, { name = "ammo_tracer", - label = _U("component_ammo_tracer"), + label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_TRACER`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_FMJ` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_small", label = _U("component_scope_small"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, - { name = "scope_large", label = _U("component_scope_large"), hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_AR_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_AR_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_FMJ`, + }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_small", + label = TranslateCap("component_scope_small"), + hash = `COMPONENT_AT_SCOPE_MACRO_MK2`, + }, + { + name = "scope_large", + label = TranslateCap("component_scope_large"), + hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_AR_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_AR_BARREL_02`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO`, + }, { name = "camo_finish2", - label = _U("component_camo_finish2"), + label = TranslateCap("component_camo_finish2"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_02`, }, { name = "camo_finish3", - label = _U("component_camo_finish3"), + label = TranslateCap("component_camo_finish3"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_03`, }, { name = "camo_finish4", - label = _U("component_camo_finish4"), + label = TranslateCap("component_camo_finish4"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_04`, }, { name = "camo_finish5", - label = _U("component_camo_finish5"), + label = TranslateCap("component_camo_finish5"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_05`, }, { name = "camo_finish6", - label = _U("component_camo_finish6"), + label = TranslateCap("component_camo_finish6"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_06`, }, { name = "camo_finish7", - label = _U("component_camo_finish7"), + label = TranslateCap("component_camo_finish7"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_07`, }, { name = "camo_finish8", - label = _U("component_camo_finish8"), + label = TranslateCap("component_camo_finish8"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_08`, }, { name = "camo_finish9", - label = _U("component_camo_finish9"), + label = TranslateCap("component_camo_finish9"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_09`, }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_BULLPUPRIFLE", - label = _U("weapon_bullpuprifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_bullpuprifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_BULLPUPRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_BULLPUPRIFLE_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_BULLPUPRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_BULLPUPRIFLE_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_BULLPUPRIFLE_VARMOD_LOW`, }, }, }, { name = "WEAPON_BULLPUPRIFLE_MK2", - label = _U("weapon_bullpuprifle_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_bullpuprifle_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { { name = "clip_default", - label = _U("component_clip_default"), + label = TranslateCap("component_clip_default"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_01`, }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_02`, }, { name = "ammo_tracer", - label = _U("component_ammo_tracer"), + label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_TRACER`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_FMJ` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_small", label = _U("component_scope_small"), hash = `COMPONENT_AT_SCOPE_MACRO_02_MK2` }, - { name = "scope_medium", label = _U("component_scope_medium"), hash = `COMPONENT_AT_SCOPE_SMALL_MK2` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_BP_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_BP_BARREL_02` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_FMJ`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_small", + label = TranslateCap("component_scope_small"), + hash = `COMPONENT_AT_SCOPE_MACRO_02_MK2`, + }, + { + name = "scope_medium", + label = TranslateCap("component_scope_medium"), + hash = `COMPONENT_AT_SCOPE_SMALL_MK2`, + }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_BP_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_BP_BARREL_02`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO`, + }, { name = "camo_finish2", - label = _U("component_camo_finish2"), + label = TranslateCap("component_camo_finish2"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_02`, }, { name = "camo_finish3", - label = _U("component_camo_finish3"), + label = TranslateCap("component_camo_finish3"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_03`, }, { name = "camo_finish4", - label = _U("component_camo_finish4"), + label = TranslateCap("component_camo_finish4"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_04`, }, { name = "camo_finish5", - label = _U("component_camo_finish5"), + label = TranslateCap("component_camo_finish5"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_05`, }, { name = "camo_finish6", - label = _U("component_camo_finish6"), + label = TranslateCap("component_camo_finish6"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_06`, }, { name = "camo_finish7", - label = _U("component_camo_finish7"), + label = TranslateCap("component_camo_finish7"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_07`, }, { name = "camo_finish8", - label = _U("component_camo_finish8"), + label = TranslateCap("component_camo_finish8"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_08`, }, { name = "camo_finish9", - label = _U("component_camo_finish9"), + label = TranslateCap("component_camo_finish9"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_09`, }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_CARBINERIFLE", - label = _U("weapon_carbinerifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_carbinerifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_CARBINERIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_CARBINERIFLE_CLIP_02` }, - { name = "clip_box", label = _U("component_clip_box"), hash = `COMPONENT_CARBINERIFLE_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_CARBINERIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_CARBINERIFLE_CLIP_02`, + }, + { name = "clip_box", label = TranslateCap("component_clip_box"), hash = `COMPONENT_CARBINERIFLE_CLIP_03` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_CARBINERIFLE_VARMOD_LUXE`, }, }, }, { name = "WEAPON_CARBINERIFLE_MK2", - label = _U("weapon_carbinerifle_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_carbinerifle_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { { name = "clip_default", - label = _U("component_clip_default"), + label = TranslateCap("component_clip_default"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_01`, }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_02`, }, { name = "ammo_tracer", - label = _U("component_ammo_tracer"), + label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_TRACER`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_medium", label = _U("component_scope_medium"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, - { name = "scope_large", label = _U("component_scope_large"), hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_CR_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_CR_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ`, + }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_medium", + label = TranslateCap("component_scope_medium"), + hash = `COMPONENT_AT_SCOPE_MACRO_MK2`, + }, + { + name = "scope_large", + label = TranslateCap("component_scope_large"), + hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_CR_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_CR_BARREL_02`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_CARBINERIFLE_MK2_CAMO`, + }, { name = "camo_finish2", - label = _U("component_camo_finish2"), + label = TranslateCap("component_camo_finish2"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_02`, }, { name = "camo_finish3", - label = _U("component_camo_finish3"), + label = TranslateCap("component_camo_finish3"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_03`, }, { name = "camo_finish4", - label = _U("component_camo_finish4"), + label = TranslateCap("component_camo_finish4"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_04`, }, { name = "camo_finish5", - label = _U("component_camo_finish5"), + label = TranslateCap("component_camo_finish5"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_05`, }, { name = "camo_finish6", - label = _U("component_camo_finish6"), + label = TranslateCap("component_camo_finish6"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_06`, }, { name = "camo_finish7", - label = _U("component_camo_finish7"), + label = TranslateCap("component_camo_finish7"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_07`, }, { name = "camo_finish8", - label = _U("component_camo_finish8"), + label = TranslateCap("component_camo_finish8"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_08`, }, { name = "camo_finish9", - label = _U("component_camo_finish9"), + label = TranslateCap("component_camo_finish9"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_09`, }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_CARBINERIFLE_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_COMPACTRIFLE", - label = _U("weapon_compactrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_compactrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_COMPACTRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_COMPACTRIFLE_CLIP_02` }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_COMPACTRIFLE_CLIP_03` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_COMPACTRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_COMPACTRIFLE_CLIP_02`, + }, + { + name = "clip_drum", + label = TranslateCap("component_clip_drum"), + hash = `COMPONENT_COMPACTRIFLE_CLIP_03`, + }, }, }, { name = "WEAPON_MILITARYRIFLE", - label = _U("weapon_militaryrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_militaryrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MILITARYRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MILITARYRIFLE_CLIP_02` }, - { name = "ironsights", label = _U("component_ironsights"), hash = `COMPONENT_MILITARYRIFLE_SIGHT_01` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_MILITARYRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_MILITARYRIFLE_CLIP_02`, + }, + { + name = "ironsights", + label = TranslateCap("component_ironsights"), + hash = `COMPONENT_MILITARYRIFLE_SIGHT_01`, + }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_SMALL` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, }, }, { name = "WEAPON_SPECIALCARBINE", - label = _U("weapon_specialcarbine"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_specialcarbine"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_SPECIALCARBINE_CLIP_01` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_SPECIALCARBINE_CLIP_01`, + }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SPECIALCARBINE_CLIP_02`, }, - { name = "clip_drum", label = _U("component_clip_drum"), hash = `COMPONENT_SPECIALCARBINE_CLIP_03` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_drum", + label = TranslateCap("component_clip_drum"), + hash = `COMPONENT_SPECIALCARBINE_CLIP_03`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER`, }, }, }, { name = "WEAPON_SPECIALCARBINE_MK2", - label = _U("weapon_specialcarbine_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, + label = TranslateCap("weapon_specialcarbine_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, tints = Config.DefaultWeaponTints, components = { { name = "clip_default", - label = _U("component_clip_default"), + label = TranslateCap("component_clip_default"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_01`, }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_02`, }, { name = "ammo_tracer", - label = _U("component_ammo_tracer"), + label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_TRACER`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_FMJ` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_small", label = _U("component_scope_small"), hash = `COMPONENT_AT_SCOPE_MACRO_MK2` }, - { name = "scope_large", label = _U("component_scope_large"), hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_SC_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_SC_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_FMJ`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_small", + label = TranslateCap("component_scope_small"), + hash = `COMPONENT_AT_SCOPE_MACRO_MK2`, + }, + { + name = "scope_large", + label = TranslateCap("component_scope_large"), + hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_SC_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_SC_BARREL_02`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO`, + }, { name = "camo_finish2", - label = _U("component_camo_finish2"), + label = TranslateCap("component_camo_finish2"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_02`, }, { name = "camo_finish3", - label = _U("component_camo_finish3"), + label = TranslateCap("component_camo_finish3"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_03`, }, { name = "camo_finish4", - label = _U("component_camo_finish4"), + label = TranslateCap("component_camo_finish4"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_04`, }, { name = "camo_finish5", - label = _U("component_camo_finish5"), + label = TranslateCap("component_camo_finish5"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_05`, }, { name = "camo_finish6", - label = _U("component_camo_finish6"), + label = TranslateCap("component_camo_finish6"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_06`, }, { name = "camo_finish7", - label = _U("component_camo_finish7"), + label = TranslateCap("component_camo_finish7"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_07`, }, { name = "camo_finish8", - label = _U("component_camo_finish8"), + label = TranslateCap("component_camo_finish8"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_08`, }, { name = "camo_finish9", - label = _U("component_camo_finish9"), + label = TranslateCap("component_camo_finish9"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_09`, }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_SPECIALCARBINE_MK2_CAMO_IND_01`, }, }, }, + { + name = "WEAPON_HEAVYRIFLE", + label = TranslateCap("weapon_heavyrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, + tints = Config.DefaultWeaponTints, + components = { + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_HEAVYRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_HEAVYRIFLE_CLIP_02`, + }, + { + name = "scope_holo", + label = TranslateCap("component_scope_holo"), + hash = `COMPONENT_HEAVYRIFLE_SIGHT_01`, + }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_MEDIUM` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + }, + }, -- Sniper { name = "WEAPON_HEAVYSNIPER", - label = _U("weapon_heavysniper"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, + label = TranslateCap("weapon_heavysniper"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, tints = Config.DefaultWeaponTints, components = { - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE` }, - { name = "scope_advanced", label = _U("component_scope_advanced"), hash = `COMPONENT_AT_SCOPE_MAX` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE` }, + { + name = "scope_advanced", + label = TranslateCap("component_scope_advanced"), + hash = `COMPONENT_AT_SCOPE_MAX`, + }, }, }, { name = "WEAPON_HEAVYSNIPER_MK2", - label = _U("weapon_heavysniper_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, + label = TranslateCap("weapon_heavysniper_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_01` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_01`, + }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_02`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_FMJ` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_FMJ`, + }, { name = "ammo_explosive", - label = _U("component_ammo_explosive"), + label = TranslateCap("component_ammo_explosive"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_EXPLOSIVE`, }, - { name = "scope_zoom", label = _U("component_scope_zoom"), hash = `COMPONENT_AT_SCOPE_LARGE_MK2` }, - { name = "scope_advanced", label = _U("component_scope_advanced"), hash = `COMPONENT_AT_SCOPE_MAX` }, - { name = "scope_nightvision", label = _U("component_scope_nightvision"), hash = `COMPONENT_AT_SCOPE_NV` }, - { name = "scope_thermal", label = _U("component_scope_thermal"), hash = `COMPONENT_AT_SCOPE_THERMAL` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP_03` }, - { name = "muzzle_squared", label = _U("component_muzzle_squared"), hash = `COMPONENT_AT_MUZZLE_08` }, - { name = "muzzle_bell", label = _U("component_muzzle_bell"), hash = `COMPONENT_AT_MUZZLE_09` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_SR_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_SR_BARREL_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO` }, - { name = "camo_finish2", label = _U("component_camo_finish2"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_02` }, - { name = "camo_finish3", label = _U("component_camo_finish3"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_03` }, - { name = "camo_finish4", label = _U("component_camo_finish4"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_04` }, - { name = "camo_finish5", label = _U("component_camo_finish5"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_05` }, - { name = "camo_finish6", label = _U("component_camo_finish6"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_06` }, - { name = "camo_finish7", label = _U("component_camo_finish7"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_07` }, - { name = "camo_finish8", label = _U("component_camo_finish8"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_08` }, - { name = "camo_finish9", label = _U("component_camo_finish9"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_09` }, + { + name = "scope_zoom", + label = TranslateCap("component_scope_zoom"), + hash = `COMPONENT_AT_SCOPE_LARGE_MK2`, + }, + { + name = "scope_advanced", + label = TranslateCap("component_scope_advanced"), + hash = `COMPONENT_AT_SCOPE_MAX`, + }, + { + name = "scope_nightvision", + label = TranslateCap("component_scope_nightvision"), + hash = `COMPONENT_AT_SCOPE_NV`, + }, + { + name = "scope_thermal", + label = TranslateCap("component_scope_thermal"), + hash = `COMPONENT_AT_SCOPE_THERMAL`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_SR_SUPP_03` }, + { + name = "muzzle_squared", + label = TranslateCap("component_muzzle_squared"), + hash = `COMPONENT_AT_MUZZLE_08`, + }, + { name = "muzzle_bell", label = TranslateCap("component_muzzle_bell"), hash = `COMPONENT_AT_MUZZLE_09` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_SR_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_SR_BARREL_02`, + }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO`, + }, + { + name = "camo_finish2", + label = TranslateCap("component_camo_finish2"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_02`, + }, + { + name = "camo_finish3", + label = TranslateCap("component_camo_finish3"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_03`, + }, + { + name = "camo_finish4", + label = TranslateCap("component_camo_finish4"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_04`, + }, + { + name = "camo_finish5", + label = TranslateCap("component_camo_finish5"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_05`, + }, + { + name = "camo_finish6", + label = TranslateCap("component_camo_finish6"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_06`, + }, + { + name = "camo_finish7", + label = TranslateCap("component_camo_finish7"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_07`, + }, + { + name = "camo_finish8", + label = TranslateCap("component_camo_finish8"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_08`, + }, + { + name = "camo_finish9", + label = TranslateCap("component_camo_finish9"), + hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_09`, + }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_HEAVYSNIPER_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_MARKSMANRIFLE", - label = _U("weapon_marksmanrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, + label = TranslateCap("weapon_marksmanrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, tints = Config.DefaultWeaponTints, components = { - { name = "clip_default", label = _U("component_clip_default"), hash = `COMPONENT_MARKSMANRIFLE_CLIP_01` }, - { name = "clip_extended", label = _U("component_clip_extended"), hash = `COMPONENT_MARKSMANRIFLE_CLIP_02` }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_MARKSMANRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_MARKSMANRIFLE_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_MARKSMANRIFLE_VARMOD_LUXE`, }, }, }, { name = "WEAPON_MARKSMANRIFLE_MK2", - label = _U("weapon_marksmanrifle_mk2"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, + label = TranslateCap("weapon_marksmanrifle_mk2"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, tints = Config.DefaultWeaponTints, components = { { name = "clip_default", - label = _U("component_clip_default"), + label = TranslateCap("component_clip_default"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_01`, }, { name = "clip_extended", - label = _U("component_clip_extended"), + label = TranslateCap("component_clip_extended"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_02`, }, { name = "ammo_tracer", - label = _U("component_ammo_tracer"), + label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_TRACER`, }, { name = "ammo_incendiary", - label = _U("component_ammo_incendiary"), + label = TranslateCap("component_ammo_incendiary"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_INCENDIARY`, }, { name = "ammo_armor", - label = _U("component_ammo_armor"), + label = TranslateCap("component_ammo_armor"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_ARMORPIERCING`, }, - { name = "ammo_fmj", label = _U("component_ammo_fmj"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_FMJ` }, - { name = "scope_holo", label = _U("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, - { name = "scope_large", label = _U("component_scope_large"), hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, + { + name = "ammo_fmj", + label = TranslateCap("component_ammo_fmj"), + hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_FMJ`, + }, + { name = "scope_holo", label = TranslateCap("component_scope_holo"), hash = `COMPONENT_AT_SIGHTS` }, + { + name = "scope_large", + label = TranslateCap("component_scope_large"), + hash = `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + }, { name = "scope_zoom", - label = _U("component_scope_zoom"), + label = TranslateCap("component_scope_zoom"), hash = `COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM_MK2`, }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, - { name = "muzzle_flat", label = _U("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, - { name = "muzzle_tactical", label = _U("component_muzzle_tactical"), hash = `COMPONENT_AT_MUZZLE_02` }, - { name = "muzzle_fat", label = _U("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, - { name = "muzzle_precision", label = _U("component_muzzle_precision"), hash = `COMPONENT_AT_MUZZLE_04` }, - { name = "muzzle_heavy", label = _U("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, - { name = "muzzle_slanted", label = _U("component_muzzle_slanted"), hash = `COMPONENT_AT_MUZZLE_06` }, - { name = "muzzle_split", label = _U("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, - { name = "barrel_default", label = _U("component_barrel_default"), hash = `COMPONENT_AT_MRFL_BARREL_01` }, - { name = "barrel_heavy", label = _U("component_barrel_heavy"), hash = `COMPONENT_AT_MRFL_BARREL_02` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, - { name = "camo_finish", label = _U("component_camo_finish"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO` }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP` }, + { name = "muzzle_flat", label = TranslateCap("component_muzzle_flat"), hash = `COMPONENT_AT_MUZZLE_01` }, + { + name = "muzzle_tactical", + label = TranslateCap("component_muzzle_tactical"), + hash = `COMPONENT_AT_MUZZLE_02`, + }, + { name = "muzzle_fat", label = TranslateCap("component_muzzle_fat"), hash = `COMPONENT_AT_MUZZLE_03` }, + { + name = "muzzle_precision", + label = TranslateCap("component_muzzle_precision"), + hash = `COMPONENT_AT_MUZZLE_04`, + }, + { name = "muzzle_heavy", label = TranslateCap("component_muzzle_heavy"), hash = `COMPONENT_AT_MUZZLE_05` }, + { + name = "muzzle_slanted", + label = TranslateCap("component_muzzle_slanted"), + hash = `COMPONENT_AT_MUZZLE_06`, + }, + { name = "muzzle_split", label = TranslateCap("component_muzzle_split"), hash = `COMPONENT_AT_MUZZLE_07` }, + { + name = "barrel_default", + label = TranslateCap("component_barrel_default"), + hash = `COMPONENT_AT_MRFL_BARREL_01`, + }, + { + name = "barrel_heavy", + label = TranslateCap("component_barrel_heavy"), + hash = `COMPONENT_AT_MRFL_BARREL_02`, + }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP_02` }, + { + name = "camo_finish", + label = TranslateCap("component_camo_finish"), + hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO`, + }, { name = "camo_finish2", - label = _U("component_camo_finish2"), + label = TranslateCap("component_camo_finish2"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_02`, }, { name = "camo_finish3", - label = _U("component_camo_finish3"), + label = TranslateCap("component_camo_finish3"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_03`, }, { name = "camo_finish4", - label = _U("component_camo_finish4"), + label = TranslateCap("component_camo_finish4"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_04`, }, { name = "camo_finish5", - label = _U("component_camo_finish5"), + label = TranslateCap("component_camo_finish5"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_05`, }, { name = "camo_finish6", - label = _U("component_camo_finish6"), + label = TranslateCap("component_camo_finish6"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_06`, }, { name = "camo_finish7", - label = _U("component_camo_finish7"), + label = TranslateCap("component_camo_finish7"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_07`, }, { name = "camo_finish8", - label = _U("component_camo_finish8"), + label = TranslateCap("component_camo_finish8"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_08`, }, { name = "camo_finish9", - label = _U("component_camo_finish9"), + label = TranslateCap("component_camo_finish9"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_09`, }, { name = "camo_finish10", - label = _U("component_camo_finish10"), + label = TranslateCap("component_camo_finish10"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_10`, }, { name = "camo_finish11", - label = _U("component_camo_finish11"), + label = TranslateCap("component_camo_finish11"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CAMO_IND_01`, }, }, }, { name = "WEAPON_SNIPERRIFLE", - label = _U("weapon_sniperrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, + label = TranslateCap("weapon_sniperrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, tints = Config.DefaultWeaponTints, components = { - { name = "scope", label = _U("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE` }, - { name = "scope_advanced", label = _U("component_scope_advanced"), hash = `COMPONENT_AT_SCOPE_MAX` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + { name = "scope", label = TranslateCap("component_scope"), hash = `COMPONENT_AT_SCOPE_LARGE` }, + { + name = "scope_advanced", + label = TranslateCap("component_scope_advanced"), + hash = `COMPONENT_AT_SCOPE_MAX`, + }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, { name = "luxary_finish", - label = _U("component_luxary_finish"), + label = TranslateCap("component_luxary_finish"), hash = `COMPONENT_SNIPERRIFLE_VARMOD_LUXE`, }, }, @@ -1591,178 +2512,203 @@ Config.Weapons = { -- Heavy / Launchers { name = "WEAPON_COMPACTLAUNCHER", - label = _U("weapon_compactlauncher"), + label = TranslateCap("weapon_compactlauncher"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_grenadelauncher"), hash = `AMMO_GRENADELAUNCHER` }, + ammo = { label = TranslateCap("ammo_grenadelauncher"), hash = `AMMO_GRENADELAUNCHER` }, }, { name = "WEAPON_FIREWORK", - label = _U("weapon_firework"), + label = TranslateCap("weapon_firework"), components = {}, - ammo = { label = _U("ammo_firework"), hash = `AMMO_FIREWORK` }, + ammo = { label = TranslateCap("ammo_firework"), hash = `AMMO_FIREWORK` }, }, { name = "WEAPON_GRENADELAUNCHER", - label = _U("weapon_grenadelauncher"), + label = TranslateCap("weapon_grenadelauncher"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_grenadelauncher"), hash = `AMMO_GRENADELAUNCHER` }, + ammo = { label = TranslateCap("ammo_grenadelauncher"), hash = `AMMO_GRENADELAUNCHER` }, }, { name = "WEAPON_HOMINGLAUNCHER", - label = _U("weapon_hominglauncher"), + label = TranslateCap("weapon_hominglauncher"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rockets"), hash = `AMMO_HOMINGLAUNCHER` }, + ammo = { label = TranslateCap("ammo_rockets"), hash = `AMMO_HOMINGLAUNCHER` }, }, { name = "WEAPON_MINIGUN", - label = _U("weapon_minigun"), + label = TranslateCap("weapon_minigun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MINIGUN` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MINIGUN` }, }, { name = "WEAPON_RAILGUN", - label = _U("weapon_railgun"), + label = TranslateCap("weapon_railgun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RAILGUN` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RAILGUN` }, }, { name = "WEAPON_RPG", - label = _U("weapon_rpg"), + label = TranslateCap("weapon_rpg"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rockets"), hash = `AMMO_RPG` }, + ammo = { label = TranslateCap("ammo_rockets"), hash = `AMMO_RPG` }, }, { name = "WEAPON_RAYMINIGUN", - label = _U("weapon_rayminigun"), + label = TranslateCap("weapon_rayminigun"), tints = Config.DefaultWeaponTints, components = {}, - ammo = { label = _U("ammo_rounds"), hash = `AMMO_MINIGUN` }, + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MINIGUN` }, }, -- Thrown { name = "WEAPON_BALL", - label = _U("weapon_ball"), + label = TranslateCap("weapon_ball"), components = {}, - ammo = { label = _U("ammo_ball"), hash = `AMMO_BALL` }, + ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` }, }, { name = "WEAPON_BZGAS", - label = _U("weapon_bzgas"), + label = TranslateCap("weapon_bzgas"), components = {}, - ammo = { label = _U("ammo_bzgas"), hash = `AMMO_BZGAS` }, + ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` }, }, { name = "WEAPON_FLARE", - label = _U("weapon_flare"), + label = TranslateCap("weapon_flare"), components = {}, - ammo = { label = _U("ammo_flare"), hash = `AMMO_FLARE` }, + ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` }, }, { name = "WEAPON_GRENADE", - label = _U("weapon_grenade"), + label = TranslateCap("weapon_grenade"), components = {}, - ammo = { label = _U("ammo_grenade"), hash = `AMMO_GRENADE` }, + ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` }, }, { name = "WEAPON_PETROLCAN", - label = _U("weapon_petrolcan"), + label = TranslateCap("weapon_petrolcan"), components = {}, - ammo = { label = _U("ammo_petrol"), hash = `AMMO_PETROLCAN` }, + ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, }, { name = "WEAPON_HAZARDCAN", - label = _U("weapon_hazardcan"), + label = TranslateCap("weapon_hazardcan"), components = {}, - ammo = { label = _U("ammo_petrol"), hash = `AMMO_PETROLCAN` }, + ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, }, { name = "WEAPON_MOLOTOV", - label = _U("weapon_molotov"), + label = TranslateCap("weapon_molotov"), components = {}, - ammo = { label = _U("ammo_molotov"), hash = `AMMO_MOLOTOV` }, + ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` }, }, { name = "WEAPON_PROXMINE", - label = _U("weapon_proxmine"), + label = TranslateCap("weapon_proxmine"), components = {}, - ammo = { label = _U("ammo_proxmine"), hash = `AMMO_PROXMINE` }, + ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` }, }, { name = "WEAPON_PIPEBOMB", - label = _U("weapon_pipebomb"), + label = TranslateCap("weapon_pipebomb"), components = {}, - ammo = { label = _U("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` }, + ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` }, }, { name = "WEAPON_SNOWBALL", - label = _U("weapon_snowball"), + label = TranslateCap("weapon_snowball"), components = {}, - ammo = { label = _U("ammo_snowball"), hash = `AMMO_SNOWBALL` }, + ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` }, }, { name = "WEAPON_STICKYBOMB", - label = _U("weapon_stickybomb"), + label = TranslateCap("weapon_stickybomb"), components = {}, - ammo = { label = _U("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` }, + ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` }, }, { name = "WEAPON_SMOKEGRENADE", - label = _U("weapon_smokegrenade"), + label = TranslateCap("weapon_smokegrenade"), components = {}, - ammo = { label = _U("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` }, + ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` }, }, -- Tools { name = "WEAPON_FIREEXTINGUISHER", - label = _U("weapon_fireextinguisher"), + label = TranslateCap("weapon_fireextinguisher"), components = {}, - ammo = { label = _U("ammo_charge"), hash = `AMMO_FIREEXTINGUISHER` }, + ammo = { label = TranslateCap("ammo_charge"), hash = `AMMO_FIREEXTINGUISHER` }, }, - { name = "WEAPON_DIGISCANNER", label = _U("weapon_digiscanner"), components = {} }, + { name = "WEAPON_DIGISCANNER", label = TranslateCap("weapon_digiscanner"), components = {} }, + { name = "GADGET_PARACHUTE", label = TranslateCap("gadget_parachute"), components = {} }, { - name = "GADGET_PARACHUTE", - label = _U("gadget_parachute"), - components = {}, - { - name = "WEAPON_TACTICALRIFLE", - label = _U("weapon_tactilerifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_RIFLE` }, - tints = Config.DefaultWeaponTints, - components = { - { - name = "clip_default", - label = _U("component_clip_default"), - hash = `COMPONENT_TACTICALRIFLE_CLIP_01`, - }, - { - name = "clip_extended", - label = _U("component_clip_extended"), - hash = `COMPONENT_TACTICALRIFLE_CLIP_02`, - }, - { name = "flashlight", label = _U("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH_REH` }, - { name = "grip", label = _U("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, - { name = "suppressor", label = _U("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + name = "WEAPON_TACTICALRIFLE", + label = TranslateCap("weapon_tactilerifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` }, + tints = Config.DefaultWeaponTints, + components = { + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_TACTICALRIFLE_CLIP_01`, + }, + { + name = "clip_extended", + label = TranslateCap("component_clip_extended"), + hash = `COMPONENT_TACTICALRIFLE_CLIP_02`, + }, + { name = "flashlight", label = TranslateCap("component_flashlight"), hash = `COMPONENT_AT_AR_FLSH_REH` }, + { name = "grip", label = TranslateCap("component_grip"), hash = `COMPONENT_AT_AR_AFGRIP` }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_AT_AR_SUPP_02` }, + }, + }, + { + name = "WEAPON_PRECISIONRIFLE", + label = TranslateCap("weapon_precisionrifle"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` }, + tints = Config.DefaultWeaponTints, + components = { + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_PRECISIONRIFLE_CLIP_01`, + }, + }, + }, + { name = "WEAPON_METALDETECTOR", label = TranslateCap("weapon_metaldetector"), components = {} }, + { + name = "WEAPON_PISTOLXM3", + label = TranslateCap("weapon_pistolxm3"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` }, + tints = Config.DefaultWeaponTints, + components = { + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_PISTOLXM3_CLIP_01`, }, + { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_PISTOLXM3_SUPP` }, }, - { - name = "WEAPON_PRECISIONRIFLE", - label = _U("weapon_precisionrifle"), - ammo = { label = _U("ammo_rounds"), hash = `AMMO_SNIPER` }, - tints = Config.DefaultWeaponTints, - components = { - { - name = "clip_default", - label = _U("component_clip_default"), - hash = `COMPONENT_PRECISIONRIFLE_CLIP_01`, - }, + }, + { name = "WEAPON_ACIDPACKAGE", label = TranslateCap("weapon_acidpackage"), components = {} }, + { name = "WEAPON_CANDYCANE", label = TranslateCap("weapon_candycane"), components = {} }, + { + name = "WEAPON_RAILGUNXM3", + label = TranslateCap("weapon_railgunxm3"), + ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RAILGUN` }, + tints = Config.DefaultWeaponTints, + components = { + { + name = "clip_default", + label = TranslateCap("component_clip_default"), + hash = `COMPONENT_RAILGUNXM3_CLIP_01`, }, }, - { name = "WEAPON_METALDETECTOR", label = _U("weapon_metaldetector"), components = {} }, }, } diff --git a/server-data/resources/[esx]/es_extended/dependencies/cron/server/main.lua b/server-data/resources/[esx]/es_extended/dependencies/cron/server/main.lua deleted file mode 100644 index 7e7c059a2..000000000 --- a/server-data/resources/[esx]/es_extended/dependencies/cron/server/main.lua +++ /dev/null @@ -1,46 +0,0 @@ -local Jobs = {} -local LastTime = nil - -function RunAt(h, m, cb) - table.insert(Jobs, { - h = h, - m = m, - cb = cb, - }) -end - -function GetTime() - local timestamp = os.time() - local d = os.date("*t", timestamp).wday - local h = tonumber(os.date("%H", timestamp)) - local m = tonumber(os.date("%M", timestamp)) - - return { d = d, h = h, m = m } -end - -function OnTime(d, h, m) - for i = 1, #Jobs, 1 do - if Jobs[i].h == h and Jobs[i].m == m then - Jobs[i].cb(d, h, m) - end - end -end - -function Tick() - local time = GetTime() - - if time.h ~= LastTime.h or time.m ~= LastTime.m then - OnTime(time.d, time.h, time.m) - LastTime = time - end - - SetTimeout(60000, Tick) -end - -LastTime = GetTime() - -Tick() - -AddEventHandler("cron:runAt", function(h, m, cb) - RunAt(h, m, cb) -end) diff --git a/server-data/resources/[esx]/es_extended/dependencies/hardcap/client/main.lua b/server-data/resources/[esx]/es_extended/dependencies/hardcap/client/main.lua deleted file mode 100644 index 118a924b3..000000000 --- a/server-data/resources/[esx]/es_extended/dependencies/hardcap/client/main.lua +++ /dev/null @@ -1,10 +0,0 @@ -CreateThread(function() - while true do - Wait(0) - if NetworkIsSessionStarted() then - TriggerServerEvent("hardcap:playerActivated") - - return - end - end -end) diff --git a/server-data/resources/[esx]/es_extended/dependencies/hardcap/server/main.lua b/server-data/resources/[esx]/es_extended/dependencies/hardcap/server/main.lua deleted file mode 100644 index 53f80b154..000000000 --- a/server-data/resources/[esx]/es_extended/dependencies/hardcap/server/main.lua +++ /dev/null @@ -1,31 +0,0 @@ -local playerCount = 0 -local list = {} - -RegisterNetEvent("hardcap:playerActivated") - -AddEventHandler("hardcap:playerActivated", function() - if not list[source] then - playerCount = playerCount + 1 - list[source] = true - end -end) - -AddEventHandler("playerDropped", function() - if list[source] then - playerCount = playerCount - 1 - list[source] = nil - end -end) - -AddEventHandler("playerConnecting", function(name, setReason) - local cv = GetConvarInt("sv_maxclients", 48) - - print("Connecting: " .. name .. "^7") - - if playerCount >= cv then - print("Full. :(") - - setReason("This server is full (past " .. tostring(cv) .. " players).") - CancelEvent() - end -end) diff --git a/server-data/resources/[esx]/es_extended/es_extended.sql b/server-data/resources/[esx]/es_extended/es_extended.sql index ab2241107..c61089284 100644 --- a/server-data/resources/[esx]/es_extended/es_extended.sql +++ b/server-data/resources/[esx]/es_extended/es_extended.sql @@ -1,12 +1,13 @@ CREATE DATABASE IF NOT EXISTS `es_extended`; - ALTER DATABASE `es_extended` DEFAULT CHARACTER SET UTF8MB4; ALTER DATABASE `es_extended` DEFAULT COLLATE UTF8MB4_UNICODE_CI; +USE `es_extended`; + CREATE TABLE `users` ( `identifier` VARCHAR(60) NOT NULL, `accounts` LONGTEXT NULL DEFAULT NULL, @@ -15,12 +16,12 @@ CREATE TABLE `users` ( `job` VARCHAR(20) NULL DEFAULT 'unemployed', `job_grade` INT NULL DEFAULT 0, `loadout` LONGTEXT NULL DEFAULT NULL, - `position` VARCHAR(255) NULL DEFAULT '{"x":-269.4,"y":-955.3,"z":31.2,"heading":205.8}', + `metadata` LONGTEXT NULL DEFAULT NULL, + `position` longtext NULL DEFAULT NULL, PRIMARY KEY (`identifier`) ) ENGINE=InnoDB; - CREATE TABLE `items` ( `name` VARCHAR(50) NOT NULL, `label` VARCHAR(50) NOT NULL, @@ -31,7 +32,6 @@ CREATE TABLE `items` ( PRIMARY KEY (`name`) ) ENGINE=InnoDB; - CREATE TABLE `job_grades` ( `id` INT NOT NULL AUTO_INCREMENT, `job_name` VARCHAR(50) DEFAULT NULL, @@ -45,7 +45,6 @@ CREATE TABLE `job_grades` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB; - INSERT INTO `job_grades` VALUES (1,'unemployed',0,'unemployed','Unemployed',200,'{}','{}'); CREATE TABLE `jobs` ( @@ -55,5 +54,4 @@ CREATE TABLE `jobs` ( PRIMARY KEY (`name`) ) ENGINE=InnoDB; - INSERT INTO `jobs` VALUES ('unemployed','Unemployed'); diff --git a/server-data/resources/[esx]/es_extended/fxmanifest.lua b/server-data/resources/[esx]/es_extended/fxmanifest.lua index 62e7dbdac..c41e3d9fa 100644 --- a/server-data/resources/[esx]/es_extended/fxmanifest.lua +++ b/server-data/resources/[esx]/es_extended/fxmanifest.lua @@ -1,23 +1,22 @@ -fx_version("adamant") +fx_version("cerulean") game("gta5") - description("ES Extended") - lua54("yes") -version("1.0.0") +version("1.0.1") shared_scripts({ "locale.lua", "locales/*.lua", "config.lua", "config.weapons.lua", - "dependencies/async/*.lua", }) server_scripts({ "@oxmysql/lib/MySQL.lua", + "config.logs.lua", "server/common.lua", + "server/modules/callback.lua", "server/classes/player.lua", "server/classes/overrides/*.lua", "server/functions.lua", @@ -25,34 +24,47 @@ server_scripts({ "server/paycheck.lua", "server/main.lua", "server/commands.lua", - "common/modules/math.lua", - "common/modules/table.lua", + "common/modules/*.lua", "common/functions.lua", - "dependencies/cron/server/*.lua", - "dependencies/hardcap/server/*.lua", + "server/modules/actions.lua", + "server/modules/npwd.lua", }) client_scripts({ "client/common.lua", "client/functions.lua", "client/wrapper.lua", + "client/modules/callback.lua", "client/main.lua", + "common/modules/*.lua", + "common/functions.lua", + "common/functions.lua", + "client/modules/actions.lua", "client/modules/death.lua", + "client/modules/npwd.lua", "client/modules/scaleform.lua", "client/modules/streaming.lua", - "common/modules/math.lua", - "common/modules/table.lua", - "common/functions.lua", - "dependencies/hardcap/client/*.lua", +}) + +ui_page({ + "html/ui.html", }) files({ "imports.lua", "locale.js", + "html/ui.html", + "html/css/app.css", + "html/js/mustache.min.js", + "html/js/wrapper.js", + "html/js/app.js", + "html/fonts/pdown.ttf", + "html/fonts/bankgothic.ttf", }) dependencies({ "/native:0x6AE51D4B", + "/native:0xA61C8FC6", "oxmysql", "spawnmanager", }) diff --git a/server-data/resources/[esx]/es_extended/html/css/app.css b/server-data/resources/[esx]/es_extended/html/css/app.css new file mode 100644 index 000000000..2478a1a99 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/html/css/app.css @@ -0,0 +1,75 @@ +@font-face { + font-family: "Pricedown"; + src: url("../fonts/pdown.ttf"); +} + +@font-face { + font-family: "bankgothic"; + src: url("../fonts/bankgothic.ttf"); +} + +html { + overflow: hidden; +} + +#inventory_notifications { + font-family: bankgothic; + position: absolute; + right: 40; + bottom: 40; + font-size: 2em; + font-weight: bold; + color: #fff; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; +} + +.menu { + font-family: "Open Sans", sans-serif; + min-width: 400px; + min-height: 250px; + color: #fff; + position: absolute; + left: 40; + top: 0; +} + +.menu .head { + font-family: "Open Sans", sans-serif; + font-size: 28px; + padding: 10px; + background: #1a1a1a; + border-bottom: 3px solid #bc1635; + border-radius: 10px 10px 0 0; + -webkit-border-radius: 10px 10px 0 0; + -moz-border-radius: 10px 10px 0 0; + -o-border-radius: 10px 10px 0 0; + box-shadow: inset 0px 1px 0 rgba(255, 255, 255, 0.28); + -webkit-box-shadow: inset 0px 1px 0 rgba(255, 255, 255, 0.28); + -moz-box-shadow: inset 0px 1px 0 rgba(255, 255, 255, 0.28); + -o-box-shadow: inset 0px 1px 0 rgba(255, 255, 255, 0.28); + box-shadow: 1px 1px 10px 4px rgba(0, 0, 0, 0.4); +} + +.menu .head span { + font-family: "Pricedown"; + font-size: 28px; + padding-left: 15px; + padding-top: 6px; +} + +.menu .menu-items .menu-item { + font-family: "Open Sans", sans-serif; + font-size: 14px; + height: 40px; + display: block; + background-color: #f1f1f1; + box-shadow: inset 1px 0px 0px 1px #b8b8b8; + height: 32px; + line-height: 32px; + color: #3a3a3a; + text-align: center; +} + +.menu .menu-items .menu-item.selected { + background-color: #ccc; +} \ No newline at end of file diff --git a/server-data/resources/[esx]/es_extended/html/fonts/bankgothic.ttf b/server-data/resources/[esx]/es_extended/html/fonts/bankgothic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f3d8049b052a1f9cfd27557eb3675bc85ce4b9fc GIT binary patch literal 36272 zcmc${349b)wm*JvRrQ)q(%sp~+UYDnCu!162q9q+BOst+*a8B>P6(T_FER`wq9_tv z8C)KtJch?0Q`KpgVRR;n3^Ixiq98608OL$(IgI0De4y#d|9fs#hk!WCd!OIuAE>UX zTh&$fo_p@u&uPXPV_tkHtYFBHF*n?@-S#MBybP^5L+h^_!ZUD%@nJYG7&_{v(GPFG z_ZFNtF=jb8boAK4FLb=1GiGbV^*{IRA9>?v6U_Y-aU}_7nbg80oO5;-8=!|X{g9DkSknAyOBb?k;yUZ-5Z|YJu)gAL#-;QTkO~(Y*uj6G_*HO>LckE&l zI-X~faP7U0e0B=k`?&W5>_5cz5sqcn51-U(oYmpz6t)ksIayK1hj`+Lc-qTs0a`ZU z_&qj)y^s9|*nfom8MJ4yWPKO&V9V`jVR_h!I+n3MxLVB?vwFO17>-9`Yrr-ZTO+mw z=-XQCH{src*wd3wu}AUreDU-Tar_aE&)~k_w$Onz&im|ypyn}9&0nhPfKdFzhXn7ys{RkVK(OPQ3 zSqo@bJ^Dm#FL(CJ!piZS8eHv%tq$AWc$$osdbHFFDkGtnpaR(J0-oh)r%zz5?gfCrvUw90^2J}`ZRco$~@e5V-CDP=v-n+g_WAr@x6 zSry*W7jNmuYVnSGHk4h@Ze%yH(QGVWI010E1#nq_^|lF5dVuW!cX$tL{{yV~GgxJD zdS8ZTcBS{3f^rj$Cyt9haYP4P`4OjCVwRx_xRZX+*zuh~CW7aWJLj0Q8%lM=%M{p9x-oP30u^jY3#lAZ$z>%H(kah6U ze5Ldo>3!+L0%t*LLAQdug2IB5f?z?vf*<$_KW5)5qQ3=fCvWJylNGoNG7ECdJ8R54 zc}GXbCmpYJ+}bfR))D(6_Fo^r_VK}w+dlsF$1i^Ti;uOB_k4Wk=~oIqwR~#!3LW{! ze;n`;EEu%Gr~F{*GWvVD0JYcWiw0m4hcve(>RYr+&d+ zewDE^zyITBY}NZ8u{-bEux0bsmTmVx{0MvK@h2W*hYsJy*l$*wW0hyhGZi0O&z1uN z?_u||2icFA#&%&_1>D@gHnJz#G&YkhW!u;~;OK7lEPIOG2b{ePSUZJ1#>TKkY!n*? ztiA>q4n!zZS;`2t=cq7 zXlT67Kfzb7%4Ksi3)DfQ8hz@Z3FWF%Mql;$eXAQk%04L zC9mT71*%+py}v+JN`|X!RO9AZo2M1fLEmhjZ$kEFan@j*(F>hM@7&pLA6}ABR`9kM zj;pL7sM-RP8Vd@B`iD$wE@&*6Io)^!-Iqvj#;Xf97YyAzWSW0-!DhdBonK`Qjp`uW ziSf~E)j_l91m8&#Z|Z*{)91@BII$UEz?ZH^-^QAKL;rAFa+$y2g!yuRLF0(g**=v| zXxxkeUGLxQFW7wjX8$zm2@QunsXuO-1}~<;Lj#}#?-c_;NBu+m)0(Gt9SMCkr3{1E zyotaze5QZ1O)VJJSeM;~E2(9zY!DwbcrYLFf}71?;*)M3i=G#3ZfNvRNALZEv$5m; z!GQdrhQR;yfrW7tKOe2alUA~QOmVldl~pg#IhgH&d2!G z^kBr}O$&#^YDO^PPD#a)*3EJ@BFTxNP)N-VMi_TdV;&kURtFlnS`gHHJfQaJcA)Nt z&$qI)fKyGcNK*6LELxi7Vv?$~9jLqc^X+uOqIz+~hAW;VT(P&I!QINdwv>RH=5FO_ zN=l$rqEBj<j9h1+ zbx=l{BM>PC&Z>d1X2lhIC{k*rE2TXgfvBw@tw$ozH>}wlXH_SrFceh%Cp4Q2OUbR~ z7M$>C-4f2K-GW*!b~ZO5azx4Nj_Ho33e=7;M^D0tRJX=?Kug9qE9q;!TxYc~VSPca z$E#)M)YNEJ8;*Ka)?fwD(ksOhR)r` zjMe4-{d{=y1Jk$7J$7vBqF^ax)JHl_TSqB_SpqbQY)Eloc95xQK`pBrkXi;QsSK)) zu$GUb}_J1<+@t;Loi`gWIxckg^SE_bKPY><$*AT28CbR^?0M z)fqPKFXgoo+pKTY|0=EMK6He>d)u6f8(y#IzVM#ITj$)TFOb;R6VLHcADr5>jtATH z-xhakZnYAf4g>nY_sb!yX2sCUIQ>{UgdgO4_VPW0zP9BOl>_q7u z2@WhTS5UQ{0Ev%_2VfBv!3ZoeScKI=cUtX^fR-pA$vr+I!yaFi&m(V=ien#4kDZcA zl|!*Nr^nusDyK^!F=lS<2=gzYxhAuo3>}CjJ6WoN_ql^=0wgeFX?n1nl>}g+#Rh}~ z`4`ycuQthim`BRIEfZG_$?|&3&ZHGS{=u0H-xPl;jd2M-DOE}fz~>5ul*b)sHEe`9 z8UtyN6PObKHBkl#yoCRXpM2yIe3!$jYWA(lpgz<)lH!OGna7v+v`dHM-Rvr(MFJ_F z@->;BlmL3UtT4rt%&4C|I!;Twz)xg01h@&ThWrV2nkE~4Bcf7s_z$ZL!o)zBc$+3C zUsP17O==~HgVr?HIQF!B@$w8F<~=0u+}K&4GUMAPh@QTV`K|aWTG3x53vcS<`qOr5$RHucUQ z?3KOk=j76DbLVc09p5&$>4CYjP?9-63xVS{r3biXADRQPd@Zam04Ym^H?l$)1_Wd$ zG>hwOgb8e760pf8-VIEuD)vZk{gK}-uW7FT_N0kB7*7D>$z_{a1hXB`T=CIl(`fR7 zYVHXw2crR(&7#pHoQ-4&q|Sn1quSl7n`Dhd+>schVQcvYtP4|)94A<-E`U0rP0O?a z)LCs(Bq1}403AtiWnwQtt!2BwOp}sxa=}c&LJc^PaBkzistjVFzN+4RsyUFWlvhvQ z#Pz!-hi;CIk)GQ#Wm9`w&0y(hY}+2WVMSx(iorLI3+s(Xs>iHo9DMx^J^8^m|A&+p z&S8DAWMQlokhF;+1~e%0oT(rsrJ(i6R;)6`Qd6V4J!nv~yjr(xqWp2uD%1z`z62xk z#gEcTF*-sGG2}c>J3s&IuE~3(>HUgJYV^(grkawHn%L_*CvTE6H%-2NeDmaao5rsk zSNhB1ep_mbH&u)nFudaFg24oUskcl_bz7 zXc5gqB*-A#NJ=J=zybMDC2TKFSKlWdIKsC}~iC3rkA5uZ6ppxBXN-xI)*r zR?Cg9SWWQ^C@x7{(ZAN;n*QFsuNM|hTex^mflmtG-@($;v|qgR(~NG$+@BNcyB3~| zGSZ_91=a(SNkOff4O$8za|ZArHK_HV^yv)Dng5VaPRj4bze+7|y>oN@RQyZjKjnPKzoloa*s*ov+IxR_ zFE8cS!U%vr@ZXMemXW{{JL}IP7Qz#WhT$MiPs51FiXe}`ZWD;NyGoM}BX%_3nO zHjKlgO)8x?;=S-S+Pi#!tK*=>I zP&P1jzJEn(V4&1zU?4Cs_S*qv)9zR_b!M__`VXcGVlrihD|zPBMeC=_#SQg=vTGaa zdj@pdl55J!u32(TpbS*ySjT6UB)}yHGS@g3@enYIfMZ!O2w{g22Y_k;Q<=3XfK7$a zG`eH--Q8LN#+{Dw2eB{cPFj^S%O=oF$-?yHh&2*U4;K_wLu@vUHG)_It!Rl1;G}M0 zVnH;=TGE`qO#2iPADz9{ia8>osEt30H8LP;2Fm z`|tcAP)k1r#Z{87ODRlz_l9c)_R-u+h8!c$1mDkxS0MsNaUhy+NHWP1j_u-@>@RBe z2{i$#xuF}$@gp+J5E(R9MW@Xv<%)BDNxqrgDe1^FFNr#_wU>_3FCqJx{i}YD$Q@^LORJ?{@5xe0Zs6T_i zXg8Qf=IB?C5>ZZqflM%sl#4`?KYQ!dHltY~)llQi4tpKQwbaI*Gc7`bl7hruac;_M z4k?XSam!QflB|C_TiKyV`c!?!0)D1}{{eWa^A(nT@{L%@HdsAP5sKt=YcOgP5(t z78RmKg~S?3^MI;GhRIw|!gPV7t?u;Pt_D+;hof#o+fNq;OtL6xeq-)(%MUwgk`$F! zsL2)3ydf}MRFiR|?V{AmrDQkFks;M7K93iYsI^AeMXHKPdg~N)ENNHTU!`h3Eq3OC zxlMf2s%83CZ@}v=H!QLH9@O^k?$&R?{An{^c&YaF%McBAQ~guhy|A0!$ZmnM2SZUb z&%!b>%>F@jNT)J3A*7BDMn@V~yuoOtIpdRpYT!f{lhE}5%s6BCgYIMlBm>I6JZ6Bz0y#oz({4(;sE%p_kXvO7B!^aoJ|j53BsQo@4SQCSZyKdo z43y?kaVAcLq%dfl$NQYOxH50Z$kAkBBB`9;46ehZ?wbX9pqrinSts- z*IqvkSJjaol@n{O4$B624)v)fB^uvWY=&M=B1chmhE?$w7L^(rd!M3kNXZadwoQ;( z%v6+PC{oe#0wI@uE5FH{8Br$de7zejtUnPx|prp7hF;AN3vJUDB}Q z$iiv!{#~wL8+)^?I3ZBkv-=IK<1w8NnKAQ+`t!fpuYWVEVbY8#)r%HQp0u1-zxf8A zanFKV8%NF1^+$iE|JRg0H6unUsh07RfBKU@^123n(1po!^}oHb==QBxANAndTd+PP z#I0zCl%OhM$iWe-%}MrkNDKC`#=xXFtON-`G8vL|+qeA8IGR~iripc1giPeTh(k?r zUOezx;>YL2Wm|=6sUXv=HT|OIl}L4_bM zCS0<2I}LP*;{kCDpF;|BzwDFwL8(UnBsNRB<|S#wE1P0foA|v_ZhNER`}Q=1LCDQA z_hPIh4>_Qp7Qs(w=yas#q!B4dCOyZJnikh{ii2wE3C#+%1{PK*IgpQFpwN71$O>sC z;1LXXr{+Q&aa+UzIwY8_2O^)`c?4U<<;sh)BRn|vq%{57kfVGc9rO>jub0QHm^=2C z36r-y#FH9_RqOluNY>`w-SrQ9#^xx#Y4g{N9g~nS_m)j_;R!eOwZRxm2D_F;oFutQ z7>5uqI0<=~LWq#iS4@bEo-^ocI7#ymmqIAcg8*%%6$dNNK>bdBJLm7b_lE~wzIOJq zB~917@?h)$^(OkeBU(#o;M&jcedy2iJ-ed^T=a!}WC@6HF!Wgm;6v^)lDnc7M4Mrr zEd(lH7Q@qW2mAApfWxgsw2tx7KzyaZv&$S=qr}R?A*P`#|HRybln;1eWp*uo_H%48`s;GaOK8d4M7LK0F!nhmI782jLaL4U$z?gKzH`5IMi z|Fz=NM{yO48=fa)zWG7C2mV3xJuGP2xilG1qRlYE(Ub5LA`H-xptmR#agYexk%1>f z5A1-YX~7k%2CE;IBF%}1kR?~M6RgOL5jR|j{*hhcP|NK7Qnfm#rRjm=#rjX=``b@# zn``3ZKD@`tZZ&l=u7J9dBREWCHI9NZbazltFj7kbbAwOYp#ep02`mX}nMr#6Lw@^X zgQ*H(&=eJ!CX-n~wVDEk#SWU}pdQkIeGcy9G;ZlZF2y9dK|d8602tQtL%KC~ihrON z$LCA=1pTx?CpO@LIWpbKh6N3fjL2e@2;7NV&@e@5G&u!|uYK`@@n>0!@vJPwateDh zJXVHzMIff7)188GX$g>{fQQ6d-uUIIh{-$1^{QoNUR2ZC4)nh317T0GsE!KFX1C)~ zl9mGRNow1HH=5q};VTJhrn@ygGYujIJ}-$B>{&ZS%aBbCfBbob(R4XCL^8}L0EW;g z&4vSwxy4EV1p?lM9k9*#u?(PO!TrEXN=x`oMR}w}lKAPTp0e@Oe3w4IT%W|13VCLJ zecxEM;){)vfS=Nlq}y_O^!3D|QXRJrB-%|h;wiu-og`8TsHQr@Fc1n%$PkzSjZcMq ziC6&51-N7yaCtZRclQdoB!cC-VW71OgVF)BJpuNa)+Bc#29M7!gOA8bBzTe-l_-wP z0jDzz*joduCiYegTuQ{itzLoFo-ohj85O*W79I__lt96~i{y;#{sngXQ#0D%vAXJV ztyYY*e`bA;@S^EbJ;r<5lF+BJ*Mi|O5JXAX6^~-96srK6u$!nA14fbi0RzDDhfO%; zgvPM^nc<^#VU-y+VRFNgn-Ki7(=N=T^1SwkRS=#Jw$7QeHCDWB&V!QP+|o>D;Rl+U zTY!2dFB*dPI#?Q_-XaNtI6{a4`Gq-0BHEZ9RGlZZG`yIH;M6C7r{>1HGXxDLmS~tD zd7OWP3t_BJNmH(=tZY|_Vb5I=n=EhFw}$#Z*gw?XM11;-dDHZnMjsSix6s&a@ZkQ; z^nj;^H4A*%p@a%|BlV2D*VH@cCRiiFDQL5j zQ_yNNoPxhu_=g0-4hv)zHNA}-N zz(9&-W2Of8>YS;^5Uucy-k=}Bgl*|nx1+AI%Y^aA#iVieDb{8!`srg$=p|vR2iTe| z&~@ zLDE=m$zDES?zTzW=FVB4j${I|0cL@}Z4)>MiA>l4$?U{J(C|e-j&wrfAn05;N;ssQ zh$PI~5_~3cZQt;-rAhl#Jy%&NZ);y9Z)*|j%%EjU@ccwXm_m30yx{#3Mrru^1PgVE zH;^)ncpuGTvQSK2oM#eRdH6wD+K=VDr3I^~eKGM(TFi1O#y~m>$+}j=01A2;;fjTH z6UY%(yyTMghvY)v3uFetH$UX|c7mcRLFT8xY#)2I=g z!C%(bN5B#K&gbRa_oTjlgZ_bj3?O(x9!A@@r{(8kXN0JcpVR|s2jU;3w5ZiE5IRWqfk_%yNE9U5AUOP;k7@7+-kx?m zx9dTIp+`Cp)*w0T;3aTPSP-{h-Y0@05L!V&5fB}4S^3UoTj%8jcdISI+V$H|Qk_!# z;kfLi%dC|vHldaB&Lb0ege~GfV7EqMu?sq1%qM-Q2c>FVpQNvme6YFQ%3E}I>@9v! z?{DIeB^PkBvpcSYo3Pp=5CLGKfIe93i61~jCe7M}SgB#SCn)`{`Q6?G9QbdI01;ty zI}rT$ck8KHSlVD;R1jkVW?_Tl5d$H#Ku}72_B{s1d!&i6KYaj$+I=Tuf96M}F?tVv zGN$T5W3D%WzNqN4gWX`tiwM=~;%tDB51oekRH438LobI`FWk$p2UzgxxH}9s0B|z= z89XRl1?MItN?+P0IXPA(f7pTM8J4E}5zG)s4E&R7)gwoFCR}BoQaekpqycFnv8_!rU&F z=BR8M9SHe}a z34R`y?rGLPi^#|MBv`p>fv-p46R<%OYsD&qPXIPuV-G?tD>foj&~z+eXnEuV?rQX^ zo^$$d0*5I?!U_HYk=16uh(p*nVDvh7dZxIHRU`@iBD*hYHm4n+)12;$mR5_CLPjBl z!Ma8kFZwhrUT6nQo&U(<6((|A>Vq#-uH|1pB1w_kVtW=v`O(khneC6i{yHDVG4C=v zf^jxuoQ}(EU0i{!3q#hD71+9%Ve2BFlVR)P5LIC70@K6<2wN8#Ok0=FFmb`wMOs5H z!8R@+`>TbmD-H58wO#J0U%>yTZ=kGta`!6T!T+bGC}x*FnmKXUO*f3XeI4JVUkFs! z_bEHn&^`ZjUhG48=FJmkUN_WXAAkL#abt)kMlp_w7)KX77slYBF<>yAb}mEWircwx z_WgD)Gi2g2JD2<%iS@fC+^$Qvk8fPV_1h=xl0J#;d@FzUigBY?^CPRqj$hG`4ZQ;9 z7E2cTV@D<#B&rl)eL;^>JA0HS^ch1e6w)hs2-1PjLgwqVafvXPVc(aResBtJ=3;JZan!}Og&rVn1hy^AYuvU) z;4y7m0LUfV7OYK}+skZQq`ZrN*dLLbWBvF(*m&NQXRbfJUI#@q-q{21H0)aDtKxPo zdXs6_y7Enz*|o%L1kpVrPmR^{d-Y{_g?@gWz9&A{d-0Agb}fu6#e{69U5m)0Y1g`J z+9@pKAKSI6u5Q<|#u}vk`je7%!tJr>?Gq-hkw&hXByix1<@%pij2pX>A6YSe-2AK@ zgYVJ$IwViW91IjON2Was{gs`<26kng@*mD@_Q7PR1 zxHP<=E~m#pH-Pz4#(?{SLJuWkt;ugN6c!~aqp=ozb$KAJUQ!mQX~=~Mk&arwgX z;#jsk^Tvs!rx(_SSv9f}3`mie<|@5ZNK+?oe&)tkjM#CDz!oR3chS*tJ|#$0R_ zb79!3y3EBTTb0R$$W~>{NZeM1G5;&JDnIvofd_9-AN?m^OCov?YAq2m0j9uBZ za_rcZnfdF_k6qcYV*Hrqv;rU>M|2cZtOEDQPDR6jD079K3K47nl%1;iX??bQ3Zhf4 z^vU}5gxdyh+JfgNk~P>N>{NhPB3=YLmDqP0t7tk+V-@C-*x`4KRSTrmyRnx4c>4t6 z0K@}Vjvco`denFqjb#Y1W!7J&-%r+ONJ}! zCBv2VUo~8%@NhP1N;2o`ban5SoX!8{%Ln!7%JWFioEe)dJxUws{-)R}fgdoyD31UZ z2?(bWqeqezWEY_yLdmu}$b8q;Xa#Ev$uO4;R$(;64OWn6;s&eZUmVZ?mu}A&;PA{8~@WE z^{4bh{6)S8pSAh|J;`W;?sn#8bmg7aw&OqtgHyt!Z?^`Y?=6S*@K7fUA)u}`SHZQ*K)u3hKjK{v((^8P%@*jVFY=$&%+sEg3{7_mT z{cy)urymk@iodSsO4Zg}$U3=3PRRFUI&lb$QuTam?ggLibhjo};Nz6MMXfF%Vm_&mEk4}-t=P_XolTgEL~G|m9btM@4lUzuY+ zfBJ!W(|7#!XZPn9+`sp$Cjb`%7Kj-*Y57JvhdA8_C<`E(Wn?KOg;enML=2Gh+i=t) znzbC7>D(YC{}J+^{ma2W6RN>mO^J9~O2I`nqYWpmRy%CaYKprxEhPhfS$tkv*%4f% z@c3t8o=-_LJ#hT8Gt(AJ8F7U{a>7#HWEI7aXQb0V0HfOS&Fr?xGk%h5Nl>Saeqm*E z+k~b)2{uRiPbZFjVY#$+*w7lMqzoE4=C7y1SHdcmq z2_e^hf^4TA!{7`ZmaJ@&2vk(3kHnL%!$uzit19!~M6n9;~a?p~^uH!Z6^vukaJ z+fzQfEZIZ(y#9Fnn95T2$a!$!x&r$u}w(WmNnw|e|Yf^W?dpWVb~A$`h&T&QcA$;^njst((L$&}{km&2x&$|gO&?Hg(EfQD;F z%;T(TMjzj#`c2awJiqC>@%lIQYq5l@^ypi|rtq~>2k+U_|CUJ^_v=-AeH(}NLtqQ7 z)su)nzYX^JIfR+J9krC9=AVdv-&X)%h zvDOpeu3APZj>`K`9DjKqU<_8i-4jtNLv%44tS*w6hA4kffDGU|g@XC3!iYrZ^oI&_ zW1$t~Ap=&cR2*1sB2lD27eQ=@+r)}Fx%vmPeEf)_v^>olesuR!wKwXYO&uaDyh#6C z@_M#&&%$xnKC<)4#rnzCs->f|9!gw#PfA7ps`8r(9=mVu%&Da}URyPEihpRyDx1#{ zTu@aRzJ79#-2Uq~R96qGCY@~}pRTO8Y=X=Hj>YO$IV(kcat3O9do3Ay=8iYtzAEhUwXQ&WV? zUtA4VP)kLSuIA>@aZaug5b*YI-);qZCm_Y5)fLQvH>>Dox8_yk(zj~g{)KoBZZ4vmk(b`0<7iGf4|B zJr(OIITT^(bViAaNGqd&AOuQ96B8Ij&3H`E?^54=*kCgMbr1rL}i0w1e5)0=HBW0Hqi9f z^{1q2%XZLo8>qS&a)8m8xzyz00tdNN_=IGQ6hq#aKc8=pIi;@^MxR)3J3EHUP0A3& z^4Fv0k2*LQO*cf2pb$9#ajss6MR+0_5~RMBg^Ize@{P5XAEZhLw8}yvTQfS)xXCdv z3pdpmofrZ_MfD1Rz$){oDK%;cx#@@{SF=2W9Ld)7obJJ@y1^7l?w}+ut!5x@4uFyc z(>>njlf5a{V&n}OLA4-Hc|cSV%vu5bw93`yc@UXkAZG@$5-Quo^)y)L%$Qe!*g$FS ztQ|b`v0!=4u#wl@UmmDx99RFtK|?0}N56e*Cr#{I^~kF6PYxJYdFy~{Z}^i%d2IQt z3Dtvsa{Db&$zO6^Y0uul;-V3O(qJ&QrEy^0u&T*}GKQ@gH+-_EctYRls|VDM>D_xk zpX;Yf(%_Y2>Sua$=MJ2?VL0Kq#NCQl`cipI%v%)`3BzF$5YhoZ6qYfL#B?H;%&5mf zs7z^P@vsrp#sL1LNuze^1v?e*OZcN_%WPH0*Van-&az;8y`E-rKrmWnqgEkB4Yd6*|Q&0a9CX`cSowr%>?bLTF+t$7ywpbw5}{MEkQFU}gj zcIWwbU;nygS=*iGZkaND>ZGZExnunoQzp-tIc37<@{C1Iv-Q6{{D}U|?B?4RH8*kR z1KW7w{5kWnmP+9n?ji3Ne$c4M&PS~tkSR(HF?^ngNF|#PEf}bK6p?Bc3j#n%=&kze zN2dSV$QM^MTQU-ooNWhwyXeDjhz7xIk3da$Kb>ugCKrlqB@y@k54@m80+SI~0g}X@ z;}S$t13|S%QZq0cMVZJI4si#DO!(GSTgWWpK&icE6iVfp zlYca*E&?m0HgZqEhH+GXFImuDGS0wDjtfj&sC@n;aboBP4mYA!LH3DMzgc?nLvcIV z^%1Ry3$TPHw6RtR)R<^7?>sV@V6k6D1s|9-=(Bz6S6^-YT-veq{Q0eCH^3)Ut{>Nr z8GEcVWMUXD(suWRI&5!Fk?n6kX4ejAY|>Q4Ru z1vdU)Y91(^Yu^s;S%F#vZ!xtt812!Sd4wPUpkTx+)9Uvki(YekP`(G=evkk{&fH)$ zD2})~G^k#4BI-AA)Gvzvm{osBtVP8i*rDTUI8vD5aEMkJOMjSw!oQjNhfH3W1yBiiA6hf~Ro4*Z;2zZ_0uE3y z$V^`#u@qsGRMQGM?f(*;kQ<(S@~-)dn<77(f6I&8B8S$=`=(Bu@|U~rI6LVFv$|4< z?L1*loI*UP|4)-iA(Wtg?AlSIuOGK~#e|iK`Wn7O-y)CHN8WYrmdP`wPMY?Y^>H%s znLK;p+$+gM3s0U0GC??`RLYXFA5`0{Z(&7!3oEqWOZ6@6kVXvuV+ta6bV*Sv*TQRw zSPOZbG~2QdD=&kMWGeE?Q2T@C5Cq+2&LJW{(@tC=48vML0s&Q2pbQ($g@|N>CTq!Q z!Z6T97L?;Pgg}uc->Pxr)~p^se&t(Be)9B^Wjmi%9vQcK^|@7<~{}3xF{8S=OK zF5&x~j%XEv|31)ZL`1?ugG!uKNF$nUzz{Ylz);9Mq7DTWd?H$Hl%j~*1;@KeHHv7W zabIGP5*Z23W=)Fx1Fsp@*?3Kg!hgCZg;~2p*sUzzsY!8kzyv<3ae%K1*1RJN`%jF0 zP*R4BmYECXUBjxXhL!dT=jkhamBXq^1Ho*bwC15~bKH|K?h4d^6lEyLB15=?qIFhd za*{Cu6N};{DdLFKS(PFhFh+|6>mmv!G>U?e0k6ma(7#-$f}1tKjM(r_gA`J%yX0?T z;l~SA44zoGh(B18nN@t@qvEX068*k;11Iq5jRSi1yRQFr6Zr1l*M~C}r4^3zXWW!i zQCyZYBdv5;RiB~#`t)%*>uLwzh=?V`KCM9P(>Ega3E8=T0g^f6u}?-N7X*o!tB|LJ zasRQ1{u#wQp}I7_-?2>}r?^lfr4$t}$QSJkYbnt9ZP56;!*XfR!vT+f^-F_Kl|a>R z(~6P3isa(~Pki-jK_&&?(vov7A`F#OM_$aJPb9lr6O&!gCz9xs+KZ?i3LxvE_VJns zu9MoASi{InLUl~3Vrfz`QP=n%|NcvY2Wly(Iwnd(@Jk7t;D(*aoRlp_QzUk!vY+$D zwRZc`1#6>$Rrl_4ISUJIDbCcCvWy|u_I!NSq|K#^@8fk!kC<9oU$AW5$=9XwcD=gJ z>+^BG&|)1nJn4q9qejM#TaE*az{@cdQ(-v_ssW0I;5kWTw7@c$WTGMp3)#95G>UI^ z0Bw=s16dRSN)*ONtBxoFac*3M0#4jN*n2Rf(#q-tKmnRy? z1R*H1P2+`d61AZgnG7UB{B0J?1d`zN5|TvF1`I(-S5zDlm2iL-{IWAb0?kc%DvA?Y znau-SApcxdT+0)OzC%v2$?mizFS8K@)GI@@l%g-36Dx2)FTG(qr_H# zhL=OurkDamt3t=YD@;C!+LnT23K`f!QP@kR)9Yp~`>9(N&xxhpCb!eM;q@f4=RjuVOEsJquy@3K>{G#uOgz zIBnmG7+b3Er9cWX!^4Wqyb?q#5&`mP#Bv4GB6T%+Pxxnjt16;uZcJ zFBxevkm3)_HzXFy^vAM}CK)^@N%+gihz@3qiTt}YgCOjXQdN1!$=hhrC}faMf>a8L zwCJLWM|p}a9w@!=rb1T{AY+ykDu%R5C54{lRx&ypRP<75AuSbYzM2<)CI}xMZb9&y zS!76r=>lD=J+`g-TEv+-_~~^&{;|HQy{Sol^xKzOzCOuo^us5&42J`C{qQYD&~j`m zKVMrM6Y(OlfbAr}HWyI{r98#Rr#2-!@{Ael2j=)_u>sLyQ5CAVgdo~Is1}}xmKqQ( zEG1AE76GEAqUK4b(Z(poV9GW=V&O336EH8yIXL^L^1Ig_>8P7Pz&1fEea$ zA3&U+`Ux$+brqHxhJ(1t8Un#( zf{`fqfRJzpk&J4O<#g>>e$AMg{E&V#f3~@9Z0zg89>~mGF}J02KKKXqm6i3yWxcZh zd|Q67zOuMyAftWBJ(*G~g_B>J8HMe-4Ce>&Q7lqPl4HQY_rH(-kkT`a`(Vk2Z&OgG zYe-60%R_NHbs$8h>Kx#De=!@a$^CO+L^A|RB5>w{=Gr?#dW5P@N(1e%x zFya0G_lsum|BFSV<&trG&HWSE$c@ zW&85)X+LyX`xBkdIec0Bmd^HOYG?TU2zsv-URG4v>;{;hW072dTFnVlVd}j6Lh=>( z0PlER4dg$PQqz}sL{RgRa~ac-EPR+m>)^wLB`TUG)=nJeodr0kd>a+u$VPErqX0)v z*8&{*6>4sUnvY7gD8NyO0vsq)D++KF!oykES%8BoPZvn|RMGCEcGy4S1vuhAF%Xy1 zu_to~m1)zwnY32OkQ&#{eOwlfdvepkU)@FEBv-@w6&?JW$WCg zt$O3-^*eZ^w&7;nFuGq;3l*Sf`PS80&;wYF-(Ttvyrz1Sh`L1sR3IdpY02>fV<$YE zUfA?fBpb3e72DZpLXtR4Ff)%SBsYOkbc<1s9R6cbBib2?B#V^DWK!qth?Y-Ige?k~ zPh2`Q>Am%Y?xy4eQO4VbVj5n6Foiy4)a&kyS~c{34~lIgnF&H1HW?Y!w*Kv{vFA=7 zmix!?ta_SpOhiQi5mm&vlg1=;%NRlOW|l0@q3eF0bZ3(N4MKsRGBl z8#vD0gyTm2i!SZUzo-4sW$lE^#&epDc2p~1{J+I>%8ciCG>bKK27=|xF73MSoLtLoaFvqCRbgA+rYKBB}bGo7OB*KWbTq>>UKiSGwPY3jI6aA@e(T%RwLa+$=Gf=m@{ZwRFyIXAxb_{wQ_TSpw1LQbBtN= zU9HRrJk3U_5k%f!rQFCHZy?|H=rVop6*Wir*=777&6CLOw-BwU6!1bElb8<$<2)+h z5;EsWz|qK$@6x`UU%ma%W$pBQ<2i>fYbW>`?akBXd-h0cP3C5!yD z5`9u-3neoNr#AYetFCx^vS`nUw|Ap<{AfU8lA%NM=eeZVT*(>T;`AGkA+i+alqv7G zkdz7=3Ke(&2L`1|K}-sd-p0R*J;4=e&XV><!Iz7h;mA zyuhvc1!dt~RDMDKhC6TDXs&}L0njclBQ2Ze@sQs^+^z^cMRQ^GeKGIt%`#;b>%=R?a?o zli;Dks7Q`6sjXFZV5K8Wfus+Vus6J52C_m?;v^aRY=Vzcx|&CxdZYf9(ikh%^Pf8+ zy)Ms=9pX>uGk7y!t8e&h!xvx3Gm*g7L2!)fLCPb<_`z`i_tp4~A!?^Qu39l4FqVk< z*mBkO(&1O67Xnd!5{z&8b9rz&(y!U!6> zFGageJl}XuGqq#>reGapVg8a4xd{F#DuJbA>ZtH0oLFaJ?sq1Gf1>UPMKOB8KM|)S zTo)qd1krQp!f!z_ClROcuRF=Y3bxB{`zaJ#^6+TW!VG3k6$}`P0Mt<)qK6U-+Rr&==Zj8@ERN(W?0#1jqn#H_f zevS!vG??>q@T%?0@%tE8yZ=zvcJX}UIfpN6r+G8lo2ebEL1)|H9}0qRCZl>wKk|@A zk=TaX@u=_-kLyZ@2f|dJP_M;t0=cr3p--XVs3MBY7a}EbV=Meqocups&gF6C0|u0r z_a7kL0Y^|{*+4oO$QKMKFB>qRtZX1JL0!$q2bGl%=wDGbNc1b((L*_g0*MAs`oQ2x zB3D8ViRzXS7tK6F@`R0KSgKe?>Wqw$<(vt7j0i|50C=eDxtU{thD>G?)}R|bA5HR8m?h!2xFSukJl zsJe)xn#>6cPcfMjls}O&XEGe<)G_KGF!l4^`>uU)*oyjcGWJZ|qk zI;!#I#!)Y#JD@+JpQ8UpKbwtyl00gA8S=P{Y`#Vo@e)5ky(WrAiJYaa=wW*^ZpNMlqw<6r5cLEVf# zHcIue7m@v{oQt*br}Qb(kZ)b9CLyD5#PV^1*KC-uoZxH7CnUER@=3FhPdGaxAD46C z$FpJvAdb)vV#Hl}@Fu~P2l_z{brfGP!i7}}tR%=~N%5E3&K!yyniq*0ZoTv8fmhrv zzbsuqeOJ@Ro+hlW@CuVp$jDI;2<1XO48v}U@l#j?e%J?=1>s}2A}Cp??nd2p;cf@r z`W_XYFA)lPUER&|ght-f)S^5G4ZW^z%;?%VTer?>+PW2fvX2y(>{m{McFq#xOoUI} zAfMS_L7ULM3yV0|I{=?u8$uHxn6@k-`grX zJ(-53RrvcTu8vF&{s9yqnvYyiijbH6nRAAD@;#$mIf+FT$&G1qMtJgEH@XWFi+Uw0 zrzg*_Sh5u*uke2%+eBEtvx|MvG{ zP%9lJ)>jCa`5?PRs5C0l0aZW?KIAN8h1jt|P+SagF?mMz1$+|}e`f*{mBh5XGypRr z3r1<=%w)o+9tUj(l}NK7dj2ZF^$Ev#7iddI0PPk)JK*v5)U&hF+}{O#QA%22=Omz} zI{Lpz%t1bCN{h%0>N(1)lW0WY1TfEJpNN-uM-Udu|HOZ`28I|d6+a1~rIArR!GofM zs?zzZJ6Fz=?}~Yo!vR8#VOc;8{j*CI*A-uCkuitc7j2#BcxPleZpx6_GtC zOiw+f+Bg5}o?iL;K;P+UrRd!-_z%ju_SC2dFYvkRuL#jv3iD&~2Ea7|ztC&M`8W*c ztcdwBj=Q+^;kG5WK6Y1g>xcKRS^dn3&KjmshAsOlq zeVYBL7S82$mphe-RuaE`+%gsX)`j{n2N^OuB34Hd`O;H`t4w232x_nJ9Fw+7Kiudn z%0PEf7RD0~n25MNq!+uBpmKRcoU?}#;^6G1U}ZC+j0(2l3_-WVs8K+MhW6^ce`+w8 zB!|Txx3E&w(MQePQl#F#clKtwhB#~rKcza5n$%rfwsogyMli=HA}efmVFohQYKRty zMw9)pNqhWhA_%2Q-n;wpr9-vK1H;zsYfvrw^@)6U>>NL?m(wPBYxGinis~hRcR*R1 zEzbteVU&a~&u-sATU@5Lv_a=CWg``mlC6mLHf3;olW4!`%64a_aX%`w5r$rW<#m_w zyqmszUG#-B{&J7%7k`jk_cxYrr_Qk>Z~P28vav@LRIaNHo*9NjMq&HF5yoI06Z;!u zt_vO8Ixf1}j8V~d%)if-qxh8u{7HMU=@{`aRF$e>)2*d!nWdebwSLMTv6i#lyp&Bx zroy|}jzW-*Sobnr(m^wKu_f3iNk>@^-2b|zou9>K#iro=F!ny|&tcQCy@lC8< zINtY(vA5Fw1KFp_9+qX@g!?w)nV+!1mMB|dnS%Wiwh80-g!+vA1{BQRjWIC@4pxf- zt8x-MqMTz_1^a+`mE@*Rc)P#sJ=SoCoBu_+WV#TY>Md zv!CW+V`IB4K}4Yg?pNDvr~yfHA?AVR!rY{H*{#^lU>kvLwRHs>5}yZ}i_5mXyi%NF zE@(dDo0tpCnX{7Z7jP%oU$I$tVO}s7VjgHN%nkF9i|u}?yyF7)rIvTul=wW*Ty)(C zF5(<>LGuyc#9Uy`Xm6j2K7WSq0Y3nC>ATVzwg%fedM>R6&>Uvn$d1@| zvLnuq*b&zS(y#LwQv>Z}D1&Syo$~v;5xLXnn_4 zVSC#?*uK)CIF>tJak`z2&fA@@Ce*vexPF`1D{*yVTVi`sMbe!~FC@K_Y)_t)e1|*9 zeW$z4BYE!jeCVzBF7@vAUP$?2YPZy-scP!SY2LK@wENTcroE9qD1BG@7a0{9O&L2f zzRc{NIXH85=I=5uWG&D7uv=!giQWD)yI1!1?ANmOoQ9nDavO5@<^CzJA#Y*cd-g?AS2^-uNRUo@)d)#Aa$3ybe7nOSm2$?r;wN_Tee-hEj2FM9OqF{Q`* zJ*_>5^n5k2xNJcAkn&f`-z{Ey{dmFpFeVE16};Gp2hU}JD*@Ydk%!MlSG1>1Ys zd!_a&=vCIMZ?F1ZzpwmJ<$aagD|c0@l`n=^$Q8;A6@_|*>O#XpV?wWm-U)pi`XY28 ztc2a+oN)JW@9_5UuCN+@G5lKio$$xK%X+`j`@P28y_9}bTsH#a-`}?pyu0Fl{ z{HV{z-}6te&Z+KKJ+69j_1@|a`?~th@B2zkX3g-LiTL+a%@;La^jq5Rj(+#|+tF`t zzXO<6;xnJKNl;AcL4YKjOUNI_Kng<*VRulfNW!Rszk(_fhHL z9pUb`Q97Zmk}%tj7jb5>FMS7xHLjf=8*8CX3)Egdn?PPr-5g73N9$sjEq#Ib*DJk{BGs_{yFqg>LJS-pi+=tJ^uWb<@ zH=Cy)=g3@{M+9~OdRTz{XCYD-k%h&Lt~_X~6uo<;98XsT`df~=w}w43<7Y~dbrt89}-Vt_7@oRc|qh$tGt$1cu8+CM&ISMyychlhB5gf-{h$5U>tTb7dp`Y z1xBcwnGs<`V~k=iqdUy*i+dQyy|Q2Sv0uPNR{sa2A1}>U;%A1iXAH`Hc_$y`J+aSe zDqUr$OqE5L_av3AH#SgHluJz|m)kA5BX{KyR>IrzSPsiIm4h$gp_(SgRj!(@@`$R) zcgDgYx4Y79U{wP8JO-8+SY}{_h90-uE)Og=xLqFHE)Og<+j z+<7uM7;qFe%!+3RYvZmBob(50#2tm38+b0v^2d`3tKtsJKSaE&LnaV!1fF8~Z#voy z;si-PYmihBXT3qvKvDw+Ne4;uCJ@r5nwB%6W>9`GDbP#9S-PW)gClg5pakPCtkJ&# D`#l06 literal 0 HcmV?d00001 diff --git a/server-data/resources/[esx]/es_extended/html/fonts/pdown.ttf b/server-data/resources/[esx]/es_extended/html/fonts/pdown.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69c76cf3f2a6bbc93f570124554fec06d7bbac25 GIT binary patch literal 151512 zcmeFa2Y_5hefU2!Z~N|*-Mziu_V)UnPFHnSv9wn2cS7Bki)>jsV;dXW*a8#FHYU_i zf&o*4L=Dw3#T18{KpaRDA%$NE*akuj0SpNc0_g7l`ObT9cdto;*d%|#*_zvX`=)(o z=G*7{Raz;PqzI_WO_LM5-@E03T}tUjrGm|ycJE#LgZDlCuu`E_O4aV1*u8Z4s=xZt z_mygXDYdS+>iWYsKI?~NxAOOQd4Ka&x8BkkxIg|zWj4H%?+1?Fcu$K}aNwOU-l8OrqDL;cog9KQbQ`@gaBPx$+7%<20#-f;6R&6ic*sLas4N>#;fyy@y2 z2d4hDTA2yy|6V1qiK%AQuk>|?Z+V7_0408AX6!dw`sW$ovi}0g@Y_)dJ)o~pT7TWX zol}!)pE{(jR8#61>K64Jb*K7W^-}fw>OS=*^)~fx^?>@Y`ndWN_2=rZ)!(UqQje-{ zsqdPmJkICj%xi7=`UT6<_ubFQnT6l{A9}817D8Gj zR8*DE+@>n|*FW=s+CKAu-ad1ip5WhZ{=InS0n@;9qrN6J^asr2)CjW@6F|J=XXeu- zf2f(eXYQT(>lxOTHy@h$m*RIbzgPUsceDQD?;p*4l=ok0>#?)kpP8(DW1qP#X_Zsu z?B;4!r?RSB4Xe$1yPnXy^$YY%_1pCW`h)sQ`Wq%>!X{>_O_Nz-#?5lG$?Px_=5q6N zbG>=Fd7XJ9tEXv0vqJ&`2~|O>(&7>|K&uz1VP_^u450qQT-cxIwA&^+R^cf2bd+AFH3}4&AA{bdS#Ki}YH(POsM+^hUi|Z_!)zHpaI@@3dpwtM_^1 ze2;!FV|_oP{iuvrPwN>w=7@QLxz8Yap0oE#NSFD`bg_vIj=cbbXLdWzG6{wg96P+?%O zU4;Y=e4fw~eBP~hQvwm*d5?Y%XZOAOy|np$4XyzyA5}qtiZTY6Py!PbG{a_CX<#zK zlMBoRl&j5Zo^LT*_`K6Fa-g$^Cs&)RdGn|_%9Cr&wUjrRn|OY&0mlHXSM%ic=Jk|s z24+EK++d;RSg1L`teklY)Qp9i1|#(YJJ}fl3$LKs&VL~bsepx)v5+zrQb7xyfQ3%b zLMLdU6R^+;TId)H9mhgPTj)3zI@&@U$QOH}BU-Nzowv@lW?|uJMrE84p0Y-Q0ztdmSkF&e` z&1z@R+3H*uxIg&Oa9enNcxU*E$h#w-jeIK_iPlF~MK?w#qgO`niM}R!D)yY%y|Me_ zk0<`U{80HF<*%str-~m{R##p?`!SVL^{P!hoso8^xR&3;Dh|eX)F{8@?+yI!eKKf) zZqwb+m{GlgRouvmy$vWivR755{vc&mLxWXLzlpM4pQP;2auz%FTPeHr+bO&CJ1Kkh zyD0ngyD9tG`9>{~ov#M;`zV*{`zZ(YA5jiz!N0@$1C%5BLzJWXLCP`xVajFtBb4L% zW0b4(A5gBh{cg~w_`FfSg>sXA2jv$1hm>1wzuRoT+ikx)Y>yMR$4T4cF5Al<+sj_t z%Rbx7e$Jy&m)O1zvBm-YDf!!e`mFsV>mhi#Q9sPz-L~AUKhNha`fujE@g@6)l$-V6 z+czGwZy5GkLVv@4`!DuMvs%qA-TJH1bNzGLa0Gj(N)w~Z>K{<%G`Nd(`59%GK110j zct#Bv+4)P2Lpf*!BMg}^<*-Rmj+%1HF;hvo%%mvC^%Ioq^uJSX&_AZ!sQ-&{lWlXG zZF8q>bHcVcY1`aoTiat>+iP3fXItA3eiMi~VA^s8{^zf5TW&TreBNSryoIo7vfoL$ z*|bn@HEooafEAv`NxMuPVej9lZdK1!cdHkwm%&xNUY%0!Q14YAP#;yFRG(E}P^Z;D zsDD;pSC2!_ex!Z|8VKoxPU%|RtlM?39@NY9D$`H9j^J4!xSTR;+9`9Uld|1(QFfRf z%1+Zq*=3eccAEjp9y3VUYlbNMz}oC`!P-E1lya#VqZ~BLD2L2A<*->nIcio?j+s@I z%glw880Fc``v7o@_DQ6ahvUNhwX8v?Qz2PIB9#_ zW&7G=``T;!+GqRP4+roo?>3)%G#eR(W1vL9Y=Sat@{~EVma^TfqwFvnD7(xi%5Jln zvQOw2u-Qtv)NG?1G}|eM%nr(7Gf6pWc2SO*r%^65yD7(^bOM_-l zZ?f%gw(W1T?eDbhPuTV+ZTq`y%X@6gdu_}6Y|H!M5dPcz^E{mSG<`r{rjMA*7@Z?D z83zWLa@br)IbxncIcjd895XjkE;G-h9EUFuDBeuD%Iu|FXZBOBwJGA*lx$L!;WF69m9kj!=xR^h_e%s@r zl5_nm+U+*arCe#`^Ja4^R zi`6UCYv4lOqTZ?QS07RjsZXmvQ-7)cR(%<6{+sGM@UK5nztBcUbh)n5^|}=fwqFnH z3-oHe-n@+V9pQ~wAE9bl^ShKe^FqpY^CHR)^AgHV^LvzC=H-;#<`tAZ=JzRk&8sN; z;Iw3AUQIb*UPHOmyq0p%+($WNUPn1>-at8G{(y4S2<;p*Cn=X1p<&~en_X$1&*ydK z1(fS;?;FgE`MlA*lyZ~peY1HbpSRk6x7mJo*nW4~ekW|dleXVowy!<5uf4XfeYUUt z1-fO>;a%`LKQC-Po;F$rICLw-|N4&-xb^WTmJ6WQf}6NXWw|#zEPyB zoAtlgCqlu$Yd(f$fF)!n5m##W|EZS`g@e?^nXxp)c;Aj$+ou5wzku@Hep+vw5{#3?d-Ab?6vLe zv+e9RY3iPhlKM1OC}_8(rkgzq+V!h(8b0p#H3vTCTa+J80y50V+)}jeWq9YJ$ zcfI$W?1*ypJKh^Nl)Q0c$>(SKpF=OzJCq6iu8Qdca91~}oAp6`vA#qf(wA!Z*wC$L zv0k8GgqG%|QX)p(qMB45p6t2kn16~y)vu508}(cCcg-^MLi4vyqqEO>h4XIbv(DE7 zt%2ddk-(b*?+koB*dM$j_~-O%PwjWYOKjEhc@G*t zD<7g0=|)#Gs{hQs_XWzO`Y$L4^#jmdE2gL6>HpzeyZOz$}`hU*=t%U2Thi8)PA0{ zpZB2OE4+`s$Z|jC7F+K&TkqMFOU-jA2hHu2qvkl}RwK_R?DI+ceBqXUhqrR(4$5A0 zC*@Le7v-S2n{w2gpxkPoPuS;^_W2%mGMW>A-PqxI_V{-57T(U8w^R0-Kcrl0-bp!V z-bFcT-bT5_yn}M9{dU5BJ88dNcx>IM(vXc`()BSDegWQUrq}zK5EP2H|}XFJxBf- z{G6@xm$r_S3!RhG_MLyCT&n+>a!`Mba#a5#*Hn5$Ry zf%%rGah|W@zbds(ZBrR+FT23NyVZW)JH&tTZcwH9KBH=|RT=(HVWkk=e28!Rut#jB z=61e`g1LM6rjK?*Y6!d*Rb%uJx0Z@>df0*`V;g-`)5|Ve+e<(7)NssaoqOmf0G;aR zZ{_~x^RW6^q{75w$ZRH}19vKQ17FKL?9ZNqlM~>nn#a~Ttuq&>KX)Eif8MIp^W;l& z0!*jC$quFW&pE}o<)@J+d_rCfaWWKh`?mLu{n{(gKtS=t`VfXX2?XORp~|4$VyR04 z2^TWe)URbe^+2W(%G<13=r;>4%>k1Rs6rR8>akGo2RZ|4DHKj1G=i023|cpCZ8|G} z)GBo$vhW&ab&*;N%+_N+*r+xEKG=(GVLv+8gV6g+ShGvf zzFw}bU=Ghi5A(ZdUtghKt=@q4^`v^UdMg^4x1oo9r}{(nF09b+Rqs*nLqqcbdfE4@ z52^>z)qD&M?L+F1^&}eHtI*_5>8Gh@VYPmSdb++ATlO{jIqLc9wfZ*oOntk4E_xrO zZ_>BuoAnxfTwSZ4P2X=S5W{(UT451X$# z_d4%#KHdEM=KpA|YOQZ=Zf$GrY#nS}(Yn6%#@1)IzNq!R*_v!yc2D-QHq%zomTIeS zYi{dn+uU|V+tqD<*71eM*5M%_d#M#z-_ML<=&?J|V=vRond4>jQ)~XreA(;g&gOq_ zO}EyzHnz6fewN#QZfU*K>t}cN65CI*q@N?w&!c!E%zS6&>ocF3`Si@EW`aNnz5#99bcmyM@DoPJRae(^ZC4lQ9sH`)55e&c*tsv?9n_8^mI}i-80C(D))E;XpVP z93eGaD$(d&tQxw?T81%f6`!2 zz7so|*08%wQ11vj0f)aY3I??fMuL%W2&bJuDpcDiV@p%)vtw&f8}sYpQ4>ytAf92h zw=8IMdB6x{_QrH15?@nUVH_vnFw{UxpryH~v7x@Mwx&8$l}_59RI)Oe>C?H)NM%GY!_H zmg3(STTZRWk27i&js(I7AaIU}I0ux8MVX<|`&BS#LCIoLFQ?i@vdLslig>24!;T|6 ze4&;lqg<)&Sh8(RT9%J8r&r(p9<7ae-PF{&+ut`mV?T9wcb_!vX5XLe>gqaWI?SFw zodouEGha5pj|9-F7qN-Up$K(jIfa9HZ6WQh*(W%F$9yI9Fb=O4~{bb0Pp@~oS#6tZa-?i(?q%lu3_wGCSV}8j# zlQZ;9&Xc2>@^E=_bXXC+!|+L8B#Xm&bjteDT_fRv`qOo$><2%PdUwq%*RORpz+-jf z+veerN|o1&p@%~ORiP_DAT=%m$>dzjk@@!2)cxy?S^w~abKR~}=FB)27HPMUc86`d zZF!L>+)eK9kxD1eTNSE2o680(`fA2ThQUjH>}rdd8l}bir=}i0Y0T%%sa?Og7Z)@Q z$M<9XPS);Pby@zBG98VDquUZX<}k&W-XBOAg~5GWvNGfZ`DAuilt-L!I6k4`{4kND zN3J@2`K5<0-n)Bp=f?G`R*a7g4lL>G>FR86X{xWSEN7C}>TA;p)}w1c=h{M#T@^z*vT&`(>XXDF8 zhMSEvL<^ZJp2*kbMo*<$E30DBSXC;ueS0cpKUTJ;%4$-vfvTEhS68y8Y9N-XDLc>i zbpKd=Lo8TX+t^Um(o)sXSX&v4HPnw)H)rEbflMaQ6wfwSpU*o2?@oBU&*8Ta7mN>* z!s`lHLvn%|KG>Mxju6j+vb*9cZn0-L**ET^OSbdJUiGTu_uhNMy~pLZ-52#UF9ge+ zq(U~|46)#NJGUknPnyn?4|CukdQa#I{ql3} z_wli8CZU}tPMxAbf)a-Dq=hkHMr84gvpnexfp6>I4BrO z>Wh^29rii(>!rRtc1Igugz4wj0xN>#kkj-(_}o zKTM0vznbFP%)eXx@q;<-Sd8w1As7zH{Dqgmo*w{v2b}$i$xlK%pgdrXiHL{XeK3^P zK^!}KCBVS@;b7>9+sU~q0ETLtA1&XBlvSV48Hv6A&JJr)?PLG@(8~cF%tLZQ4CDUIz^?{Oo*PuS+ z?>oq6FjN3|7=VWXcrX~)sRDsT08X7iDChz35d7uYDgp3W?*s6&R&W7c1A7N!CsbGf z-k|H}0z8*ZLVw5L?kqQTmj~k+{iV|*Z*<$2+&#(O16t5D|D4yTth(Oa zJ{=6+We_+Puo8mVT>gMvrzXPQUdxLct>FO4{yNKx2lG{0wKg@>rIQtjSQIwCMps8X zHr}2VpM7wL-31M`TWIXgDLFN=Q5gM{8REl)eq@)O$Igi#PW-1ifMp%x&IWmmy%AFF z`79el>($K7V&nK4nF}b22O$+oCIjVtBbuF&and?C{S*DA|J0A1x_25h3U>6)Uun8)l|M#2Al zhwObON;xHm!vBBb;{)N)z(c!sdFOz$aw$u(%E0H= z#Sa9W9ncReJwa0{0_BM~yV4c*A~2UUNwXj>muSVeK2Hn zJ1j#-rc7r#^~vdP>zXsi-+TAfhwo+vjHy%Ir9X#%rOa<2-&Zm}aJS3iB6})*(R|TU zNWbQvG<#T|yzBUJ9XNiRJzv^C^OOFU=&>L#*3kdS{dXU}`tJ80cl)mbj{nN}a3Ea| zxma$ApnS**a!>#%*wPh*mc1o(MSvf1`3jG`S~}rZ3K+){mb28#FZBtF?dIGyKy-CM z#P5dM>I^$B76}Jhg3XNENyc0;e4IlAy6_2%`CT?O2^*5=0gnyM6|0)sW_CX0MI$L`MO zWOE7-Y2^TL5)gzOPY4O(py*?V|z)X5*m_3?+ z1#BI4Hlt^kjdD17dxcNj!Pl%JKoqGbmWAv} z6|Z>N%U)?toSHl}>BW%T&JHSCFLW&XeSX+pRxsPEbMY zZc6_P>s8@m5Kq*x>M9tBNl)*J9O{zx3SDlst3GKTqphmkb1WfeC;t#dhW^@_(=I>G zSd5|VnC##vI6=5B5$xh?0uJZc)d6BbOeIt7;A|JmKav?Af$i#A|M}0a{>sZ={hs%j z6K{R%^j}Ut=h4P!%MYmAriSxN z>(T~^oS{%c7>@vH;o2i%u!biix2d-FTrxGB5&Y4-Y8itZsU+9UW< zqhVR?#^%HX3cG+iZfy*SBU2pENJexl>;&8Q*ikv_^hjSl9_}vk@1kE9?bm|xd08S| znW!nN9vKRjyClL>nTJIa=J9U2fo}L8UR!uJ+ZRad&30>hxTO?#B}Ecr<&ah3Gntr6 zBRnhsSxQEdIq(-#68u#{8~CFXgS~;S4w~uXps?@ndIG#si{4H2&EhH5pYNHC!)5y= zz%>RHXkIA@a-0`q?b%RyUvLcVl$}u$>TBny8{V*NcuHS;T2zk@Kit)g0P%~5%sT`j zGv)#=t^^CQd&)#HBn-dOL3Fl(fH$j< zEx9{wNuQa)zU-2^=^r!UE9TI;uJe#TCyR{yT!Ft-W}PigE>P+0^5^^tuKXz?j!O!y zAkd{d=gOa)A6FFc2_up|gi+*uR~!(DTFF^3S#(W&wUq`*Fc0u)2an7eMR~tyIcI?BQJ68L6?Dy=i##fxB<}o1vk%Kl7d! zznFW&JuiOo^gmC(ow@t8$YKqlJbFg~vZdTeQo+d%r;_lpBV%AE7OVi-%&VVg(eRz$ zyj$0?d?+8L|Ml)~f)F%&MQPDDMuq2rC4>^8N-xm^u!0UIKFhmOgImTfWf~bv=R_Sa zlBs#*5&fkvfB9{C<*8RsKPaSyc75AIScwgQC#;(2jor3f8$eivQ96kYK=>!9(_OlH zjP{v-Mw*VpOi`TLEX#zL}Fn1kr4F>%qH=tNTJMABU><4Ag@v*UL*eQKk=?rm?= z>FMt&Ju^M?64O2N75Iy@+hoGP(3sw5O-|A(eOH+`>7@?18~K=pZbz;TW~!hupL+U+ zje_HONpO4^N$gr*?}Q317&zo{N}_TLO(KxGtN?l^tH^19o#QNf6UcS10MpOdj2ETG&TP zOQV?b(OHDbObU&%ny1QgXjD{1vPo!^a4)WfNJxcn_4TJ+_12JaT22WU4|(8R0>%aO z@Ettsdwfy_*bm;N$gOa4tkjfP zLyNA&ZZQ>tY$eh_d9F<)_L?!V#$)*t7EqLT9?Mh<>XhMMJ2hpQrjw>qMt&wb;j>Ku z4W3(nk9EfD0okU=b%K<4l(4l(f|&nB60~eBoRYiyh5tLvzL%|@m2Gd&)h}x|;(ed4 z0K=5nnZz5=>Pr@pc8o4d#KKt2D@{dEHm%#Im1TTe)e_o3s)>cU0X>iSiHM`)sbo4> z-{;oVBDeT;2dKM{1Vgou7F;U^GOtf7vv~HgrPN~$>#NQ#z0gcf=UnM!B-&hP%j$3Z zF%Tz5B#y*cBo5k1>Le1!h-@Xse`Sdi&lV>j)j4T~5$i7(`jP_O?)+ zziy)Q@?kdW!XICwv-1C1i)vC}mrdrv^)CG9!fuSV&TUPa&u15`m`^!3kHR|JEc!dq zvdU@bHeJygfs4<30~agqC$f1(6a`Dc0#$4uQaT?WUT zmg6Aj!RLdik8Li*?FMWAjz>@@EQk~m8jf3#0xyCe{XLqNo$2a)ggp>Dn#IaN^r*pL zrPaWtRVs;dXcnHgh?6bjYc((~K1Pf@EzTsJu3VuX1s^j`pYLUyH8M`(ZwcMS(1UGm zaSoUXLv&p%X2;vhnR)~KW=0L>mtbT>j1rkwl)$rH@~k^eRZ1**Si3TwJ5ATPP;To{ z6Rr`KJ@dU|hYlUPf1O#g#;kjILSJ&(WqL1Kzv-{6UN!v>;$WlIWixM3UozihtKeYw;mLcnNG1?K|H% zbSA1s(Kg|DEv~#ZxwcfUO;qt!*2_j*aB`#8c}6^I^yil4n}&KjD^tk>%km9F{T;|V z`h}Y|B{Qko)=isInPhD%>zbu8@l|A9vr1RcQ_7t9w6-GvcGg)@RIZ*2BYfsUeuYK9 zf}EUU7;*9Xf-MRoI$< zLO8SfLeTf0te=`%|Ehjhycf2oe{@1WdvauC@+HfS`3GaJ{NMy=7TJK}L(DBB7CN|O zOmr;UULfgt(}|ffvLouc(=nKg$|OahjFc6t5_e4No>QV(MrU1BU+1cq4;}jO$wM!C zH+${ii!WiHaqnNfQ2#mitJ3(-ug$ON?QU-amkjo08(GVthPo=$aL($UoN-nS*Bb(C zxT;!Q_TXl=v9m-8q|Lg4j_&q=XtM@PuB{wjsAfE-RvYoA>g)=4jSpb{8SfgeVX7HR8}^0WHRjy6_uS!YI>_yuel(es9nBhb=Sa>j@1{fh?mzc zzeqnVovW*;sLQ3R+T?fJZB_B;nzhT5-PL`$mFw1KsxDf$!v3*hEr4_0l&DzT)2-N);KgBmQ6e`eRPoJKC~Q!Lio5Yo(247HPrD4_6BlVhz~B z%m350>5px`@WP3c*QP(ZY4xg!Z2FG$9S^@by?kP;?%BHIRA%|amg#@kvP1uA)n2wU z{=4QK`k79Ktz&K2VqKr-`8(gdE5_z5|NiUv^jnUbcig}aEx=C@OHFhzHQe|3$88VP zA=!*6Jaj_gLn;ytL?f8OR45t@?N!k@{y!-8XwOM0+ z2cdp(b9xA^h!FD`rZ*{9dwLib7LkFUIbv%s0%?Sh@aS4e;LlN@loLxGRp=G6?rPTD_dsG^_+9J*wP(^(8E-EX7 zW34QMQ3KB>1aYTgjl%afaBnC`ycyX?e0IY6Fs<)VGp>0&ZZ8$o<1%hmgB!$W+oV}%U-o-bFn+NuMT8~h{PcCe1cNZN5`BX5v7TuCe z=Z4d{oCwOmrXJWh9&GpwY_7Dh`LR34@^<_#6U<7~$Bw|F_&^wh0w`b}z`1*Y09=$- zyM>bvPlz{Wum}pF0C+5T@2Z7gbwS~};>ampphm$XCuBh}``s{(gkgw4p%*w{!AjP1 zMJuip;Hzmg-gou2=zc27QP&am(sU!3v7+|O6!o-J7Cmi;)ziLdTgxt zT)zYpX%lVN6TkL5`uXQPuj5e2`qSUSn^|<}%hk!5Zwi&nXJiJ}_qkHb7(5#|wuo?| z;rN<|-}4?GvhIy~tGdTqcRsW3SJ-tQb+33NWGlPA5p3mrlJ9)CEWS}1-&a{8 z1wloiA%ZV-XBU$OWb6a( zWXYbFjl6_&X^!GY9&?Vlm10zK-=sZp(+vh=JIZt{mWTnCp_2Ed9Ua89!aJc@a7(d% zp;9o$$;Rdt6+tIj9hK`&)*n_>4kZ_=%4-D=${a60%N!5ui<#>w4=ZwyArNfS(MS<1 zdXHlAC|_QsL&0(#2({^0#KnpNn;yj_u3#V>JirNrFN^F)fGUrdIZo8s1tysVBJoZd zwNozBP8>dCZe6#6g_Ou)aX9sOJQ4R%$_iUoMPn#f4lU3`jP6UCP_bBP3$j3Yw*?P{ z%x=gcl6^9bv$d07w|EnZ&ck9HbCFV^EftH#V_W>;#NvXV59T|(b?l0Eb#}DlT_=_r zF$k2bWQAOfV=d*b*XK*_dR;j)zFmm5EA! zK{wcDJhVT%H8p!o=V(mUcAMMSEb?&9HVd?6&iL{Zi?=q9V3aB1(7-X;Bg^GQ^d)kpfi-SA3;Hm*=v{bQ>K z@%>owEahIMxCXk{M7Vz+a;(py>%D4)UQ3*d*F*-qN+QjiPp$mYITgZ3!02b`hy7iL ze4-ocYO1S}%8`EIq{^nr^mSXx;}qVwGM?*w}nBDF8?uapi$2| zHIs=(GYuJgKeaIAI77DQ+QOh^HVpJiRINMmTg&2x$nBwMc)yB44FWMPYR>B>QQA#^ zroXqlBbUWfx2~qpS$QdZGPCJ3oz&IIY}^}}nc57C zROqD4^4<%rL0B(Wf4~BwcS4?$`=;V+%>7y9t3`W?M*Dg?axG0I)37iD`HF7fx#$KY zlKjV9jE9jOmcu!O8V%t9RJC6$&)$xa3&Uyx^yX;;l*vO$ow{b&HsZY9G%m9nJs0Xoi zBNFA9m9D~-_CA>)`lZEM3pfccP%S^`)>zE1czzW?Ro~QPbW>{+y13a!^;pq9sc(1B zcD>B6%f%H0H5tnf!_=1rQ2Un{jdw6_@Lq|VFRX|!CVKcn?6>pVyk+B)-liU_P@UD7$TWd|Dzpo6C+09b*mov9@QCg}6Du z0Fa*1--|Zi*T#m!4%%4H^QzkA+RKohVz>rGEAWWHOV9Iccikt&2_3(f`g-v}m@>;v&ZU_N#qVE3l?m1tRZ=DAc2XI1dGO~i=(8VW|hzM!z6 zi3Sgd!YsZf?z!M%gwd&A-Y_yi&!b8r z4%D^OSxbO_k2mVy<8{YsVO*TIUWqxCGc8dnxIhu+j$j0D8z&MtFb4*hBg6;Fb}?8t zIM5G(+uLCF{EiZyKZM(l-J8XJ)HQ3Ax+uSzwz(${0uP`Hn+@cM+d)&4bm1Y_t`gDqW6`0hFvpOD=DBMW?*p5)XQw#iytj`5$dmuUSjkOsXsO$=I zk%^vNH)T2(yF<+cP@)q?ZgyX-70yg)tWSId_c0&#~|Q{X!R|?ON)q@)?YY zI4f8V&cpr%m!P=Si_yOID{{|!N^ti|3(H$>Q)+3xUw9f|iI#RjH&#HL(zwSCr&2;~ z`6>FDi`_wdRSI?lghZkei1ErU3x~xT5-_}`vtmf_edoj0v(&vJ>w3>~KSbQLj&Te2 zP0unXp5xx>b@7YyeRxF64`IC?W0+y0R-=Vd-*E5$jX{p>HD|FGirTS4hvV8_S}ub+ z1|}1j4dZJ>@1-V^kxHt%)+FH{m(8iHj+|fZ{J5Qg3gM(c8CdT*vWS zdBNB)riY%%-ii5cEGc(?%*C-B0uNu`{NXmto`KM+r^@Rz7Io#min3^PtT~sB%*Lhm zd|Djmj!E$T|FSXJGx~}LTSc0{Iwot5ccJT?8xf=*iojg4C#+I)wwtbp@f%=;eK+0n ztb)+c(h`fdbhMxlYRk?B;%qumq(>HpR%U#&J5ZAB*nyTOObjhX3^^+L0ALgC0_ppN?kCrFX&5qDINJedKQ&(7v8Y(c z(kP(8*-fe8MRB$}rV^a}zhz98=P%-H0Tb8nU1xZUfE~fv3%kXa;B4P5{yeM9!P&Ec zI2&gdah?l9;qAd5GSDG!pg#I?1m`V0)B@%hcI%iU=U-_-oHu*OKF<5C?2pzZe-7E- zo>%zHC{oc=c84b(bFUp%mdCR3))BeG)8Xj|hsPGa#Upnx&==aPtc8m_Q~yQ05pJ^< zZt@^OK_`BzLs&!~@mn2&A9vB!A+T4_yyCaBPvol3F4HLrqXwdK#M-zrXMJ7DlFmdMz1TQ-4u@c_J(>M6M%WLTeu?L&4YHL99#NuVO4v9Eg z2XUiWMC+h&{HUu&7EN{st-6l37nbeU!iGKxvc3Ahr6aKXScy*X63ed$3`X*U)`n-$ z5!k>f3%dRzTvu^11=s&JS5M&MBUg5}ar4A>bPj!iH3p_dUm(rc{ewNEM8<3x1YkY6ieawL2dK`0auwezCJJ`078j2JFk8tMur#e{3OoXZni zIM_b81uF95sHnE1k)u91e50wuV8rEUwsc-#pTu$iw^h*ZCoiI_i_Rad*t@WM83& z^JS=3)vaFgA-t;eg)SViaS~m~A?_a%tU-bWUr#bRv~rP%f16U`-$@`{1}h2fiZQu@QAeGtkoH${G@PMYZZyBI?>nW*5Aa>`m8Wdh~M-zIFPck{il0X?stTNf)`B zGk+@+*I%$k(!zNv>YhY)3@MRg{@}xM2>^BG|9q^ag>Du9MvT2E`&gM>UqJ2zr9SFH zyuWB=mgrW3H?ftX^qCdr%2QtBYbTazeC>RDwzW*3qY@^6`+m_befA3Huu2!!g3w@~gk1b`5BB7(u9u4j-EXMrsWPaRjcijdTu4dP8_ImsE@i0_;h%Xb)=cOe2G74~|Omvr?{H{cuqFDd#b0$aL@GT{u*qI`-L zc}ZVSc78Qx@shJOP985QF!&u;mMFqNkJl)*CBLzRm&DLcK;DI1XLfpSE!K6Wsm$t< z)5(JK%p&}xg@qo+uMd7wU{T;FJ&?c`I^u-qs^f4fFZehRP-AjFKj{PJyz0&4CuhS( z_{qZlu(YNGHWxhS$=x4CS|%_Fdo=og$qtd@uekqc<2qK0&!Wp!yOEcLS14ZNb;Hn0 zN(wiCspYIQ>B6aI5w2XWjUZaF@bOdto4jr(`ICKNyR|@5!nj z^&)rY3@Vu60I^r1Fvd~5h$0amml6YlIGvW?mr=>(M9V^>_{DpdK#%8Lhm)jL4@@*3 z&C-YS)Gl0T(lR_gbQ~iVOj9=oh>!A9enF|OJcMP^fS|2ec_=rQVXgcUxqly z)C>EuNK?94oRD7DX8q49Et627*-E&B1&`}IPq&i0TzI+_@K%vVyJuBs*S!yNSpgSZ zPkoN}W;9HalBg3s>Z7uS&uc-`KRmyV@q^*aJ>*`cS-Spg>+GXCTi0J4bB~3M$i#o? zd1Cs=j6ez!;!^}j6KiE;NskH_B;~2FZ(?+JtH`~=njW> zULg#G!&z_~;uO@?p=>GiM_`VmuGAH|wzdR}Mqw`$ag@MSaMTCck{@;<+g+HQ&)f^J zd^#?0DasH6Q`~@O1JkcI2P%FoG$>S<1;(@25GlgK(K=+!hN17<>cX%%FM**yuXXvn zrT(I-nhih69_0l$630Rxezuk)j0mPD{i1Dzcwi^E zzN9uL1sZD{5_M!v%z@nv>z+Y-=lXm3BA-{(aYi zvpLV_#e8=AHIhdLTt`)RPlZ)KhA8XhO&#tE2aZS#J|HH1S=fY7#j>g8#!|A<-d3s# zrTt}ms@f!$hs2Mz<7DqIu}Atgb&7Fv*8Mn5ay6HIW+O_wHyY$VDCUU-w+-FX?uBEE zxVTw=2vi30Nc1`!3o}%AOkq#9da~OCE`RU)_>Op7pU(}zg|3k zQMqs+9P2`FF^$=2L2MRtb3Uv29@1!T*-pTkSh*yl1p|S4+y(RqBIFM z8Xg;m`i*BK6bTn9PH*1)0_{YmBD(6!nW@aFlLA+M{5@rLOR`qg?eFc zgH|)u6420Fo9~sJ4|^BG+JlK|=-$PU``Q7+DZx>GUI=uWD+VNdD%xY87vlYKZe)CN zN9@hab#;E_?As#3*>PRnUJVfoRS3gL#e)CRgQQzZjMD8uip)iufI1n{c3hU zqWkI7#K=EBL7oDfBD^^Hc5jxhjT2I5Xqn#A=i7T*sHsE-E9w#5J3yjGL=$V%X)bU< z1&wOq2F$FBDYzK2&*$2?pS(7UGPrHi>iE#~Mv3zi3LYiMkHmBk{Oc6&EFmElM_Z6a z{ku9bj=I2eu1)%>X}??f@|xTJs^iuR#=qOK0I1LFE>L0oPf`1#8{_239bJjbyPVit z@LZ_5_R3E1q;X+lO0o+{TwY(NjzyR(rN!(*Rxjt>jOD7(N-cRuN-xE7BgnlF>jp-4 z=U3|cOk53hKI1UNHYG=!Kae0Hax2|9F|;`sH;jUh;D1iomffhSk|$R1JKfP`iN?cE zo-i+X>QmWn>6r)L%XkIfzXMo+F&B&T8iA^cW})ORFt-qOeN#QND+&E7ngv%E`0MIt z4*s|Bx43zGeoGSyG?|fEUC=uk^p5iuB5G%+^L9$D_1OJqO)4&vT5L_8qQ2(h61l77 z`Xzk)!~M9J5C*|ja`sEk#D()R{x6KAyC9zYjhY+#UiAMyj+VK}`FbzM;;Zh8ji1+w zSv{}#*hF`rz{a{N;Zek~2@kT81z$9&$pZDc$U{}Uy}W#!zeHV8{q}Ivtf#++-8cVs z*`jwb{?E;y^)A(Y+r4f5B)FiA5^24_fU$SlY9c{MrlbgtCS28U9~|LkPW#?-ghZFQ z%)^6s; z4k4bEwP+u@7{qiO2(g*l%d~cq_S$_z{rqXl_OkQ*pXe7k4c@`7XN!8SPk*^4tkoeT zVJw%Nq`fg6zysZeLd4eW>L4Z&Lan#0=<|5p967J|587CMB-SR5XoEzvwAtCpGJV7% z^dn5;bVIfZFEX*s=_KJ|qBe=s^ck|}dRd)b@`RgUW8&1Q9?9&~b4uXo&xid99@W$;MqUzXmOSR&~IM@?{uNo}kV|Ph4Q=Mt5~&aV{_29<$;o%pUiX+qRXn3-Au>RqAfe-hVqvLjmSb zQTyOP-;cfCi;p8VCcO7ZVC2b&ZZdRhX(C4uo^fJ4L4dE<^&~iV{nqE?F!MZYG6&!K zH7~KIXM!qC7bm7DnIAm1_|aSZ0M6om!8u1_G+4llyntIBNvA3tA)s160c zKGp3n7>`4b<&|2SUxOcKAs!u6mwPSDt~9@#=WCNrlL)3RZ7*3DLUee(HX_fs@UeDu zduPVRLBQ9lG~OM-4;H>RBYj|)l3O!=#Jj?c8MhC24%XM9B&NtU7ucA3&`BGEPF%m| zjo)+atErJ0)YRA1*VU%0(}W=@%)-Bu16|YKapzGZ>x{Zx1a+Od&lU+q;+?gtdL@+O)7Jj8ptR9$-k|hT=#I^kdFgy)@Ku;>O0y8lI|Z%%dg@4a;Tiz~OvUxIUdA4Kq@ zJ+uGkWbpsvI+$O(4EXDmaXEWs=$caRN(|c#eL!%oTZ?~nQ}9($tik}>n97xN?Qg0GRy8Gyf@V#i_kDmV}TvYq0mr4jxr z9n$?|)7kNnuIu&qu`~bm=;{{9Tz~Q#z`LC`9w5ekpW5}|B#@>BH%$u$1K(mP*O&DU zGPBqQ8}ik{g%ag#|LiZw%|e|%)mPV(tnDVGT6SzTnVS40PEaRO@C-OMV}T@mC-Qq3 z&B8kxo6;?PwRQcisiwy1pH5X|8&X{pw@&Q5ZK6BX)K>BI`>OYB>A#>gk!Zc3f6Jcg z`|e2etehChPi^h#**cXUnON1G;Cdxe#_^={#9Zx)0eK|=237!-(2$OD$|FYzK zCq?y_^dr+*fyiR~wOXsbL2a_2`TkOJIY*-Wxs1D?5E_QAG`-!T{Q8sL-YvT2NgdyR zw>`@b7Udsxje3;vAwl@?Lst=x#E`W}t>ghQ>PbJTl*m6R>-|xlECMcBS=b_+{e~`aBdk)aRkxSOIIn=f7eM1H0d!(4W;WKPNsPCl61(e)kinPO%7X zJ*WG8>pA6xdX>a>eH5G-mlzhbgHDnwY~TWC8}hm$2q%B66EtkI!-I(N22I=KW;uH) z_+{IpKM2dO_s?B|43fnocs8xoO3qQB}Fh zqehyHOq$M<57Qv+&AgDkc9Pd6!w^XXao*ewp>Qwj=zM8QUV^fcmX5m(v0jWzf04OL zejgcQC%H{TlHaO+NE77vvk`bL1SAd#AP^aYTkC-cJ*su(Wriz(5?8sbw!Btia+44y zVG_PS{`~ftul3-Q_VH!_o706z00LIPA;PLN5e-N9!&zr+sOs-L-PsXN`4xYb~NH< zPBNug<$Z^6kbh0VJ3E*B`}e>9=6AhI>mOcu?X_1$=+w*`}dK!cO`0iQE*eeRcJHEvXd0>-t*LdN*Y% z)zVilfAKB*1ez20nG0(^cEX-0MXVZj46CUs1M)X{LM3=KDgcT6EbhNhqq7C4p1Ygf zM>KRGuEWVhWu$^UNAY;Z}>XzvIL z)n+$1it8QKKAgfkO2fCkUi}ey+~CPS7&11W63&-3nVS1HZPJx{o_)i}(2a~@)_cg= z?S128<6UFCw`tRTufK6<8? z*WWb#%5L*FXNH8fOAfGrm+#2U0d_ex_mHbd7DE^*$r$o0Ds(^sR{ zSFO#hbd~LE((R-MR*dr)GK%a${soG-q_S$_u%b)YQhY&F?jbT&;xbLjC1|ZUn7SsD zNR#a8`MJ%G*uK8!rXP#p5>7TUSa34-cz+-}7yW);+Kk@#F6G(zIIOVs9HWSaA;5GQ-5PJ-tk z98l9a#LRHngt``9M*Q3+W=*1r(}A2BuChz&hbqbDgXAN5pj{nwHB@TG+bet~50~JI zJ!<2Fl5x%7mq~h37JImwG6}U(?L8Cx=t{qQQ0$TzyM(OIC3)57<#+=R(Z@6Ll|7g( zlObb*O*N9}(K`kWm`w=ZV7QpiC>$2fOIRKc&~cV-h@ozcE8bf|Q!QIzUtf1HpE7z$ zUl$g*hPtwtt~MNZ4#$G$aLSJ5z6a}Otr3Z~b;#Mz!4{>VyLBdJ?X@-t51Zr=5Vo%h zhMoH+YvjFDTpRD@!tS!Qyft#8uoGxNwwAj_@Hq`LKY@mhK~HPcPS%BPJU~?e91ndK zgWI2Ha_YZ`Z zYn=Isx`**N%Fos&XwfEpgIFz+t*wY1C3SS;R7|g#{tORkPv#e-y=HCPh#c{F5b)Ho zH;TExyhmO}MDDm#MHv>YBqJheB3Uq&V?XWssS$%=JjKIdH`S0Fz;=!wEY_h}FS}U_ z$u?4aR}e}s(B;gPq%uN#%u%EHc{RW&=XjY+Q1g-^(p0l*c9SBuMbl)$9bKu%CFVS- zO3A~5shtIJ6PLoiG>q=RWm8X$-aX2v`l;BdF4Vy~wX(bWwjSM8brtZe2c8b_>{dT@ z;aQ&JngmLD2avg06pIf^vM4tD>Cf;J1&D4sMK^Du7iruDpSPvGTxo@u#X+2$5|#_| z@EBJ(!yy5+Uj>{yD>q_E4ZwGfmkUS6Vskfp~Cn5dW>L*Ufc0V?H=V*QXXsl}$CY_~vjUI3zdufdmsJX05 z_G&G#Z3MPuYCbhB5X(^Fyr?Nl&!rHTRgI)rdB&OXc+|}6@1Clks;`e7{MKt;^O{L+ zxfjn#z50PiU1d#iJ8-G1`$q|NZDx~l_n?HR37=BBM(%ogbPyDEws+m*a1NST()zDP zV9Ac|CL_UmgxS`?Zd+GaPy9{>$H!zjg{9|ur>x)vD_E=bUEi6i-#I!O>t0FLkWT&Z zRaMMuu)wIWnP z9gf|El;M_IjjqNvEqm5I?(9*EmfZ>3Y`hjjPY61e{R&T45Gl_5j1 z2deQ-A6_xKH{y?_(24e`Z@T%-arY$&eCQBK>l2AG+{{QyZAEXQPk?Pu zTS!!*-~@a%ZWvtlp2XwbgFrne2cO?UeO;Eo@9exA$ggng5{!b*f4R!=yKP!^OWGjo zye9O4=YvUth@{e?9Ad|wm3xizv2k4+1qC9%_RCm0I|H=Pi zT||DC{ePcmJ}LK`rY7DsGO+xOyLR2N#F%Z%2S)ZAGxB_N1+(*dw-A%%v`dY-mPC5w z06YbwxtQoiVZs{;8yO~MCV_e&$Dj67|~z4EYx!(t@v3w z1&)oat>CJjR*CMC+b4YB2ynCKIDb1_UcCRbt zOwxrTex;%*GdrLywll6z&#h>sY;FZ|h!$?b$xBw&UdifSJ6=0JIy}(d+v9HQrg~hP z$lq7k(vXmpt3U-=3md^5rQ-I@dIZJa;GzPP{OC2S@d_Z@(SgC*+AE&@Y?Cop4Cxi7 z${dz|htvI;+DN>$y1q^C>v-pubb8BO#$11I$5)N{s{GSE>2y3^7OhRrSiJ)|VJ~&{ zP*{ZK=P`6InDVe=JPPO=y`&p9ZxA-8$1Ic~vX8DbikC%Y> z2Z&V@4iZKmPNzITmfxVW8=b@AS$+e~F*UcYTLF?M;S*3QOpsPMkU-XSH{1$Ai#W;? zSu`YBe$UZ_Xc&AK>F6b3u0g!gD z)bE30T#=1`8r>p;IP9mn0iFL z(l0}725&cDX(@<%DKrm3V$&oE)l;6VI6xNkGF*}N5^Aq1mX`d%yM{0%TBt?ZF#n!S&^))tT?33(T}RcK(^0^2Xw}nv=f-sOaAcrc7VxlwkTYf(43Cq ziCBD#-$^{??!vx~c1Vj}mtTD$siR0byri$Yt9^UNw$@y0t}Uxubc-t!=Q7QrXO!IG zXTvSW1h=R!=PQRm3w7lt6zyn1!7Umk!53XHH<4&Ca-f*-H4%tAPT1Kk>Z-YE(}(S0 zBl(sb^*J@&_bsx3`3X!&RxZI6`LWVUiq|A}`rO(o90-KB`4z)*Ci7YMM3Os)RD8K? zCMEe!N={>$pPv{Ql%B`AIk%75^B8b3X=6L12Qi2SP4D9@tR69mimmHSSt7)-D*4*X z``SBJ^m+@P59ig@_}?$IX7DiZruSt^!vqGeIcLl_DW|4Wl{ueT|ylkTB9 zXIpLyfCgT&tSmN>nsubMy6LZ7mU?!Rim+TZTln13E#9IWrO5>nYM*Drau;=S{z&t? z7jJT2j_yUqtjc1svTZ&9%Dm$;u+--1zWBhNT|2jL-ne3XVBONSi)HCf`~Ldump7K+ z?;{2L{cje3AJebn_b*(ORV#Z%H1(U=D}x>El~v2wD}sW(ugtu!3j3s}nO}5PrTZj+ zmd)4j3-V>31R_U0*q^g4OQNlbV3B=7Tb^$Je47*+X)OtJTlDrxu|-dlHM`+OH{c@e z%05}F$vIk>#hYGupO7%Dk)(WEH-cGLT+rXsI+h)6Y-vOens2!9_le-v*Oc&WI7@l< z!!LUK$Y>E|Ekq*03CV>>aM=a|Vjp%OVKd2*Jcvgverl(7D~c>W5BSPhm2~O`FFFzyc>({s5&A} zW)6mO<1}N?>q6@xFlc8NH!wkhA~}d~a3eFnt4 z?rtZnMp`^{U9YE7D|3zYj|zo@13K4Mj#HHQ@?BWoJF=pA?M-`!8uHifT6X!S?za4) z6{+sdwnW2{3!1yO_vjT>8{4XTTdPJ^u3u$tj--?Ew!JUA?xI^SUY1*PU~F*rg>8}Y zs@Rs#YKF9mq036 zg)2wRSlYoiC7X7#nT}6=O8@orAK!n!-tfu|`U-vJrmLqvKK+R+8E+>Fz0c{}(NHzz zF|yOq7HM9L6G}^io{2V1Tb=r(c8(vH@5MH6p667%ZS{yO8YQA6sU zZ4V5vLn_)?@&wxh-5ul*)XEbhPaN+F7*$?u0>{aSgPNN|Se?{1eyIRjqksymYshyp zwxA(RJS+xEeM#vTzyfC9WQhKY*y1|d?T@&CYwH3&W?e4BvW4(?lpR!4&gagt(SkrI zJ1@i|y{D`@+mX%XntCrT>uKq1Yj1DrUY1|#{-f$JO=Bk|9|bh&wPh6G|9bneRa<{d#%0pn)X`%o}HPQ?U_Eb`^;H@Ad=6J zC;M-}=P{xgp@`5%*M;R^I|A&$KZ7;M#e(I;KdB_DljD=i$qK61u^{##*>Kd6(secZ zc3p)rxjTnq(ez~B$bmC6J*&m`=^YdOBL{AsDfabtr4GXHv!@4~SM57FQz?~yrd--H zaP3$3-#lGO0DFsZ>u&2!I77&?SighM=+L;^`XxJU-Cet%r&gB=jyZ^f;8%%!`gYU` zS;;d+!0%zq+-@S0CtQ=HbwWTx1IH?3YJ0~mRTXWe(ITP=U;Pv>3_KS_x|Pl z&s;cUzxnO=|MqX+|MvSo{_*=s>%{dx2dyKF=^#WC*n46m_j8t2`!fqwRgxdWp&-(u z5?nht0vD=rX9CV>%zcJm$bG=PN$a1`4%>Kz^ zhzD>a^uEVu9{Hn_o1cBxf_?kT|KNY>eDZfoZ~Tw=9mIyUsa?=h3EXL{I*fD=?*cYb zySM;-$z(E@%ypwg!=B9aWD=droeBGOciwf^>EHd`M?U^>``E`m_FM18zE8FGjBHLi z?DulMEBbGzbpS3trW>k&8-OP53Gbgh#Omnoic`&H0ofwZG1;BDogIrf98GUMEq5Yc z<{g>RwLG!|bs9Ju1;W3Mh>#Z#Z%v|kPE&F_8h z+E4kPhnludYqh!rVbll2U{y+`EJ!9=4j8N+D0Kx)uO_WdyAv6DG}^Ue69WbT4`hOn z#J=SfK;Faw$?`Hb|kQaj55WmcJkT8 z$!ixMRs2ajhihl86V)3Ad$~J&6lNxcN*Cuc3Z0mtW-bl`H|Y7oshO$K;avc&R^8sv z2ebC99Q}ggE)pQ9R_5>W4#}5E)(lEgh;rW6IX>9oEIK^p=IYhXoA=BwxA)w%*uQra zMHkMqrS5??kP7T8POTtdb?xZw9q26ej&xpoQrPXA-)`$*b$xG$8;YOm&qBWxX5%QjfnoXs|Fc@w?>&ixo%;bQ8U&}E?!VfL;N(hgCHT;0wmJxX6|8TIV`;L2i3`KAoAb{e_I~Zj4RUjDHF|%F#!_Sc#B^ z+9G5RL|9Rh!bAW*=d2ueb<-7q{f#KFsP;bl;m>{cv%qYhe5}R>Pt=k9E#4+@zXItNSYJaA7%Ki!~fE{(_I>y)r zO@JOipvc?Eqyv?l3+ogGQIB+l-s{TjqVo?Uw$z5?<4GS*I3eqsh71ddPlGS80%jU%G8y8s)t zGrMznWV8c%x5L%D?W<#WoJOjX{R*7c4!yg4rS^87f@JR)6af}r?RjUw;qrUcl`C>6)uYY?m)^D9rt?v??(FN`Ww%y|MAdavc+MelI4Lq*h!g|8<+A*tuk9KEMSu=EIsF{Q{`(EwcoWb9O zEqf!@80ZrFJxgC}be98{`Y1dDNHO3pwOs(NG**Sk5i_E2J26D`rtBW;7@1h=SOS)` z(CD)T^gNY3g>8Z}s%=5X;CN^4VR9f~6O1jPT&h;L> z?x=&owN5%x)WNKI^66j%BXoWAS`e|I4#tqXMm54(e%}P}30!rtQEvl#XBWDn6 z0*}1Pg*c%){q4WUn&7j5?0kJK@f&zn#u`BU_6e0!J!0h(R{pdlc`_6&16MnlM$R*x zhDG9`e)=OcInoqjuu*u1y`W;TQbfk$D3T)BqbW!u1VWx|-T)bk!NFX1aB*;9e$U+O z^duoh1OX3zKz1NEFgDx_KoLZ8Tc^9D}+=F>*dr-r1#a4<6ZphuvqyA&; z!m11Fm;9ptKz{A9R;`y*?*JE>D!EV)F6BHfsgK<0ayGLieDP>LiP3bZvne*uEw0<`U?=#j9qAL1l&~IErPjs5WrkS2*e2;sJ#e^W~G^E#^`k( z866Nzd*AYvYwyN^A<*>E$qMLxJx{P{Y7M^>duRDHV4$>EQhlX23!Yf&kDRG;u@s&u zz48|K>XkP-93-#l%8NCVF$BVJUV9HIgyD>=JZM9|DHR%%jC)AqY3p}>uX@ly(H}CB zgzMW6&=4h+hG@}JtWYpQx!&HEt)SxsQi;vRElXBlfAxU6QUpr#tF=onR;Pqhrw31; zxbf)WwFCQBmKSHICdS7?{OV{b4x#X?zR8WQYv+*92rGFB8sRv`>JY7-Sq`rI73;C5 z_TrE_!|D}?ldS&$rwhK-A0t!PGnC6BY;JO$F$61vD@!m1vvT&*3lYZ{2O&-(;W8+Z zq{|S?x@(^ZI1$Po7#+ESY|q;$Z^>pC2-~*TP*b6GCO1>lIDf~rsQRO* z&w{5uH?{hNNllbk{9ob?O4fyK-au=vLy*%!a1*SAQ4KHc7Bp95KPQf-i%O4qo==pq z^?e~Fi^kqATJKZqUCP5?gZwhM0njpXliSwLmS=8#Zi$$#unac6&IqCMMrKf#^y64+ z&ozs#=Gq>y(&DT|xfFKalFZp9l|x zM~4k*rqR({c684u$`K}T%+v_#bc5+U>UqpIW4dTM&zygZfD-|qDvb-J_?(0shpZBQ z^uI&dJ~u$V=N~43IP2hNj!8BZfK#9+$!Z9 zmn@XekgUGGT$XdxH`X^ww6q{m1E|QoS9=GZpS!69rJ0b&!U;o!WyY9rd3!YtBo-!G!S7&{lR^bm~l}^5uhCO>%TTYK6 zN{g&n5yXXU|m3!d>HEjdd28SvmQpQ{nkI8d140ydKG0# z$x;!e>(n3cGqfTgcpLObsg&Go^C?U8Ad@Pr1|GY5P+yGp(F9r?v%EvL#XDd%$dggO zzWu8iP>n$o!F8TToIf$Te{5gW645PbYKanVM&5Vu=2)29vU#!0Ksa%wcCFr;plP~T zd!4L|+8-%ISEGyGpk-*>I$Oor!~lL1&B1oC6ms;&G_9A55#2-6)HmJ-Ydbok3igAG zqM^V-(7oD9he#;K+hr*zxCJ_vgWd`9qfJ~hT4fJYQ(x!y~s5H5>&2P zS&b616RAyYK~VU&Uc_;9Mvdy_FgQqJ21f=#h&i9YzZckWeNQ4CK8fs9n2an^@>kjO0gvcjydF)T99ZUaAU`N{>xz9i7o9vqurw3;c1gD_! zxasJ)S?=)YEvQ$?BgIjGElx>*b3-I((-y72Q#NfLc_M9vaKPS!%oq1vaOZR|x zmESo6kOFdaMi{r^uCKzYfD2MgVByACzvg!^rfgyFyfI~q{fj|z;>RuzR+Nj--|&q$1VR2cX0 z%o9wR?M0@`&YZ?|iUW|rRKv?~z9@>?5_zP>TD*j^@MEdBNeLwME=RCdz)2zp#xz*W zyz?MU*#I%?O7?b@emh>R`iHNTbKa-SfCEA+CHwkh0fC(20ZPmJ^*JDx95vd*V<3^yuII$|G^o@`+D45B|n))V@%A3e%x= z#A`JjL)Iz|k{ffmW4665y;ZE$rPhLp3?LHgq5^(BbY*-Pn|Y&VD3N6%>bQ z)yIEH6LwcPI<*s5uVUR@d6!PsBw{lH&p!I-cbtiTx9QyKIODIq4MG=LcQe+K^{C1+ zPQofP%Q$Igif)#120?>zA+cvowy0naCd0GQ#)X70ScETFM8mdLv&}BiuHYiVf<7qQ zu^0!sVOTIJ#S|#8H>GS;S+YbUexa#qlN?IS(tNh&FLBc)7Qy)I2J0!61gTm%^s3}8 z0s9Mr11|s&apaB4pd$mD!r?h0GE~VGpJ%2;roVcFx<&Hx3%I5CUBL~q0Eg3>_ z^lm_FQXo6q&`5iZo{~7ci@cehXq1Kso=8YzNSGx`|9xK4kRM~*?#=rr9LOJJ@3z;D z^An0Dw2#uR*WsddR~0n^xgsFRa@lj>2sW^c3iPs4TXBp82e8>E`w}Ws(zn>Zuq_Ut z{8+lf(MQ2j80JS&o)e~c3@)!exJOR%i6zy31rPG6ebaHiU3-Q$PRWnicX2a`#($?) z7coI>`4e{FrJ4}bsH(y+HHpR!yt7anMG2F*@R|k_i_BX8r%H?ODc~3m*l2WEAVk!J z@aXwuTs{lgL#7^KuJvVXXmBq>@kjhsXa(?@L-Q1(A2z+#4Kru^=)STnNKTRTM{P}X z3tS%Ag40Zl*v;2neUo@{Z-^6yuRUb%MA{HgQnjx?^fgx&)cz#*tRxn)QvEhgyA;2a zQlT;qIvqo<#N?MH78>iLTe`hiXnYk%9gOTqL_7e;uI>5CSM0z1(wE{WdE7qq*dw*4 z7+c`T806Ic1^NCQs_u8{eK*VznhVjzi`H!x*V@>uMsAtKgU(i|Kuc4N=&y-&3PS&lUf+=rhB6eSun39ZLMUI#j!<;ZZ%5>gQ(r$7V2 z0J%ju6B4^@XnDaE7vN$5t~3h}hUS-{-+6pIn;qXbzHdd++mKi6_mDH$u59Pn$VeOD z>WytP<}R?6R+mAnC`1jRe^V{ODNK8GOD&dTVHudR7OXp}7si1{jp#}wp@8GS3aJaQ zjF1HQ@~$L^PY6lKWYU}1UY2vpEepj%GaXYMQ#h~+m6F|EXcK8938}{QlL2vv)Dr|G z;=}c83Bq!*jMkfr)$t8CRIyx+?W4r^Nuqzihe+sUB03+PGNWa3Ke|lML33nHdkMnJ#O~~0FJq5TX(>&9xld7T$l0q?Ox4Yz1_QQYxnAIl(*sl zQ?3tSu=JvgUjxDQ+kFB|rScE4d)ak$AI~6H;8be=?$@=2c#o9wCa#1xw8i{|jD++7 zB^1y1_&AVVh?PzP>Rfn#ovPo?kK)*Z<4d@3&- zPjB~Xa(ve=0G96AC1t6sQ5r=eWLq4MmZe5G4LeLOBN-oNa-bp=t5NEtzYAT{Z|yZZ zT>DTrfg%Dx*@{>v!DM!L_&f_sJPQ%$2y^#`u1=(q_q2354k`4WOMwP3R%@5i-4wR& z-L)5Dtg3wngG?=Z=wNYT99Ik*VJjnMQ zz$nTKP0_ld`c}rPFLE;4!o15#Ne^AHxCnh#ksw6*ENbtTU2fCXtyKV&p}z=cyRhxi zbuiHZi+UpfOX4q1~ zGJ3^Dab^;E0{V=q-l7fO$!Xw+!4m7}=zhV`tJ!U=49JZv=U|s5b7YX4q}s1+L!5}NpKtycODrMEjh?7 zrApX1RuPtVsYG@TRSxZ2S(sO9iWq)7I`ksYp|gJxwBEYtr_K3@zk@=&n_vfpU(~op z)DC66<_XCOam|>uKfyIKVv}^W?z0&QQ)I~$a(T7zfgQeu^aGA?6}l%XEY6qM*`+vU z%@~SJm3K(8$OG$V&3^09;6H z+UT6_oQ5e!N{DT|%`|e8(Ac-4pq3F5Qzv@{Jh-YJt!ux7`gsC%+1O1Uvy*w`JMsWM z$tTgWNIA`T`mLDNS{jo@Bw#&RjBhHKFw7Pb09{5vW3+S=|HLnqm^RQxY4m6dthzds z=~z4Hz7s$gRO#QxPKCh!nN?j9X7pwj5O-PN(^tHrHTaa-RN>8BeNti6r#NFtTDRJ!3L zuaXtk;ug>)JydQm`*26vYH`BwbyW)ivIQasf$D;!v_m z$;F>&YxnRhSZ-UFq&{7CyQ&<-TH1c6IEcFDHg4p!jr4avqUC1M`pwY9qjfsT)@kIn zC_B_c8pPG>-vKRwhHG!)w|_N)T;22O>$VQgx^GVF2y&=7yO|Rxs&V;Z~74exq=VUGXTULt;S9OAfKGL{p{MLRKC9IPTL$HFlt1dNP&O~LJ_8ciE45gT#X^o$^%7oX!h+yTnGDG_SS#M07nJPHN3#XN!jmWMq01> zpd4xbz#lFkg1)V~0sFxev>K~&6xda&jR*I&MNN6!(bj{pm{^ZW*>w{_)+26?-Ek5n zD9wQa6izkdgr`#Z1<8NW_CsSF5D!Pm{{E2IOTjPptMw@ibSvv&9JoqCOMR=CHo!Ot z%D=A)F5W*dkt%wHrHr-_#z91Nv=E|4)Cm_)lSo};Bl#w=U;ByUGCu{tBm{t3IuLiz zim{^F6_83f(}sf=l`9EngyjJuA^VH_mllwGMBF|yv=c`=wR>{X9`rI==Y^IYVDc)| zJwaL$aSx;@Jb`LPvi3cV{ZrTuo`|i4L`-W|pB0Q%t=f7+`5K}L%@1%f=TCmC@XBub8_Le5m9gItXNnx+6TF^x)fx(so{0;z9AfQHJDE<y-N>D_5`}rWGd(x8N1b<@?LIvx;Zbrf*t`1y z*xQn|1G^dQI)JG~#VOB)(uIbUN#&4HlS=D>x5wArZCTxu-PqdT1|Pge1oOCAiGYb^ zVvu4B!|Ttjo3+_#8g;*_(l*z=Y5$H&+n6q0dJo~06UNH%ugmyHEOd3?Ty_NXbb6Va zRFJVM-i3eQtDP#BEvr0IMm+{|;4lF0piALFXRwhZH8Cz3U1MgrSM5)F83;4dP!7V+ zV|I4D^QjT`r^AKJ!^NMsoC1O83n=Ksp)jcC2-fqnIFofAhp8 zUH{kcii_1j5=)$>^6v6(WW+%(pgZf$QIm|gq1^r|H6&-rxAYAM>MnjYU+>fN#cDSY zlQkiV_`uM7DCXxbppYIvXB0H73qwTgoQ1c;&B(7hpK{lQ8E|-Is92ZvZ9Rxl7OlV6 z{onu-K+RVQJFVC$0}d-Suc+#JMPJen?p+0w?OufI(Y?^{`YL2L!&)yK_!d)Z*8C1k zAP*1Q*6`vmTNjioJh*G8Ku(+UKYQxcaIo*Y?uzwQ7oh)ppI)|v$73m&6c~8T-*Jmq z)oUmoPn&uT#L3u^$604`PG~DdUb9$4EAW?jN~(J?fkD|J8s)ARMe@)jTn3YTd0W?! zr*bSFN&%)^%!0nwc^VC!L%j50219HN1k##+h@*Q@AO0az?;>?oI03{-B`<3!b*sdE zRT_Ri99G3x<{}YNeGNsd@#Tmagd4NH#4kh9Ew&Z=g7Q_bb_Mbk7odl@;lm^hu_F?$ zLz^IvFPMZq)^Y25!js=SxB@ERcJTu{ui#g+GHcP&1ZUI0sm5YvRA~feL!wIAJw*|x zjw<1%Q`+_;3RUuE?jZ2Q%`dMWP*+mqws$FHZc4a(y!ZIg!v_GT%UxWaF**?9b$gxK zH^Xa$GR*`2zzj6QGmK73(~wuqli;NFV4oLwIhYWjZpk#^uWy#-4Wo=K`xZ6b5t$;N zFsmtAL9R_Sg1K5|2tlEl-`JwY>Z)88nVu%sVRFVRp?gcm^TnA0d5;e$)xk~hfzKHsw z$@Mg94xCWz^hmVz2G^)|DsB#fl+JX;)FRLDe@1ozmB(~^fUXAsGo8E zt}xpOB*oKaBtVI5REy}hZ{}h#Z%wcD?Ax}kbH#bK7s4#bGdPVcYxKB?D!@@cqGE`X zVK+?2(d>`tL{;aa^~&nYku6SVatMB*v^UG_FDMGWq&f@{&KN-miNuMInT-1rIRD5S z!mY-64Ff34#;IGxS{UB7IIsxnq@YX=w3S0dAUtu0h$I@qTYE>0pkp`;9{lWP;LH*G z^I=?TO)KksNUOq8g4gFrT_4*05Q7O(JX8S{J6Nj{(pacr5UQjqdU6+w%+RmK11VV9 z{{Dv&l!B`LZVnKz&}eOEXyWw znntmh*eD^4VG1joMfF8aW)dlLb&xlv3FekS!UqAS$cq6AjngY}3qTPhabQ<#cTo7$ zxC2lL;YDx%7D!>4s{z1c=aItN#t4|gLi@07?V({nzOip_|6VDB4V{uxQL{tnPKCJB zg}AwiyqPm}FiBBy^Bt-aBW%pH$Xs!6gL5@*eNJN;p~wXqoJag%{Up{4YLW<7DiX&D z((4Elq_B+aT+%*`>nwm`ikqjb?;>tB>UKZ2^Bf{hc@ak_E=sPoWCCDuk2 zq0_l$A#hYg`8*ml)%T)^^pXVwiF|p~yNO-M-?Qzzz@o}13YU4h^b5EHRsN1H+alf{ z+1uaSwRgvSOX_1h4lvAMUwUdJfEPyC%aAUKLSDj0^mK`@A1IeZ+zOOYn<%3YqXNY! zpHHl3wKgdf9D=LG2&+aJH8;QswfAi64k!%3)02WSYH#;yig0HK>X=zS&dST~jy;`o zm5>^U72$?Fc14-J=7BD(fILSTtk%Dh=Rs?N*jFglf&k+%?N|ZU--`gVb_Ob%Lc@-4 zX3@F^cMJwa28G!viiZz-jaqFyrdT^5DPDzkSW1HRimndRHgimNlSu+Xf0Dqxpd^xM zt}~#&7ZRA#1PNj`$95roDYeW2lUa->Ac7z2jUM_$HvwM>i#RljSLf^MU)uY2>4;{B zMJ|Dz@OnZGL|0d+wF03)p&n2+!aH_#?h1>Ow)sJg7{`CV6#3cjvm(!in6KoA`2VyY zBSgC9(8V^>aO8Z}9aTH-(6#7@Iv?pntsisT;el(>2@X8McX!mO0NZ_o4l&&?^YkZw zSM8F)X)HS8Vp#cN2Dp`!A?;f#8KQ>{Jzgxj-}@cP{%Td-0dalih1~+$fo`e7*chW* zx)62Y>ba%b#KrIP2i(%gCTwVh(d>oGfFP?%7r#-~*^r#C0>hoB;RdJRjmqpYJo@H7MXOn=A;IYR^8R+fvkq8Z~<1;e6#Lf`J+>6zKP6>^QBP@ zoJ0n;L<>TR&1;D*mFoGUsnP~)X+ zYnQveD9t=!58#W=D@=%>9~JM5HWo5>DJqEhKuK}H5XDNElCOtko(32zlhN~7bjUr5 zfzM_W>lx3$6Z*teC_!&@*+Qp)eHz!|u%jf_ax0f2gA9h^x^paMMGHtvm(iqmKm&IS zbm*EXM9C3V7H`u1(7}dx_InIyaDZd3G;4e3d|&vq16r48{CePo2=@Q-czoCBG*;+h^TVy=%{;gQ^)Ez5>(JR?20P9F0_lAqQ08 zsTzf2?)PGR%0BVh*R^kPFBBjT*ideGz~$4rFU-dlP&Qp2*9F)Nv)wC*3m?r&a7{(` zf0wyfv2cRa?6?Ea;G;Mn9!Df*0Pe137#k1hpGP7^07l)ZY4gePO2^9HJqSG5MkH;x zVSfwT26WYflhgvyW&#u0I-sJ#Ic-F-S{uYX>a+yGb_nZ1PcxxvNtkxVhz+RlYlT`a z5Ut>3f$Z*LpE_fb?v?@)k51FA=guX7j^Q$0y^7+l_}TODL)G||KRim*sR2wB#vhuk zd@hClLIsBE&XsoOWf|e*Kz8P_kR?1z@ygi+fHk8xlj6WFb_efsil0@};0-;HXB|Se znpL?HM=8A+@PV0BEogm7&TADgf^Fu>-NUmZGr&F#d36oqC~kZZJ}rQI>ajlrc^aAn z`VwKd(?AY#0A1eUxWssQ%sLi*s!U7J(4cLNj}A@`O<|inqRi^XC9!n46Cq9!=0YR4 z1{Ose5z22>YoQ;xInt0psw|TOIu^}@j%ld^O>E^`1rpPa?_#T1OjN6B2&=dl)KzyL zf`F^hS@46c2IImp>lc+b2eeswb1=FGfS6DdqBj4--WUnNe zBvxCUcrte7#87Nz%y#?;v*G#jldF9T1b@E(a`>GBJ`2~*c6+?$}O zGjHeemnAQamY?km2yT)Yi+daJTN2zjay3(EjWEV%b3NjrtK9;c>h8s!g?LZBBi3X$ zgSU03D;WW{4M=$`q^;RA&^CI`y1jaC#7+~Du3)8|LR!k#0@?}wS!Ab*Mw<0#T`<&4 zUG;{{v|g-X1yvt})?E)Y*ZNd-$q0osRUPbE=9!J%p0Uu^v=h|`%KKogu14v_msOzj zatBM4SfSvCTSVz~#ngnO*yR99uT7L*?WkdEvf(8;uGxll56+ z=9|7ikTZUVAP$pP`7`yC}Kmnr4cE^M1h7z3^k%1-Z6au-&A zq{E{wG))BiHG<;o$b{q_PfOXvamhpK#N#l-23^Z?8 z;$mTWb)2R0Qfv0FDBd2npwEh>OF%5fo)|!nX)oQ)QoRo+o23Bgb;Zroirg$c61ay0 z)Z=a5gsSx@Z;~iszf?x@0`5ZHdOUm=Wz;bu3+EufsB;6i8CB5Gp|Nl=Nus8V+mu_o z4KynXsF*BA7rku!3qb#ljPW{Dk~$*sz*Z{*9=x2qtS&C&VoFB~ z*J^1{hqkD8M`WU>JEvNdhB{1fXMcAH#X2tP$H;qgPQohtM-2Gu%QF`5qOE*jc4MQ>6S?AijL8K19O-_ zu9Z1yjYWrW(b`NPdq?bF8Jpu|pyCBb4F6^&dy?Q}2l|4L7gIyatD(j9s`TO15spO; z!jtg?8&o7lb6BUCkjk@T*kwXYxJhU%siCts(W0Tpq0XfM%o4}Jy18U$5^ZFKTyz|< z=nx1x5DI;7L-htb784!Zf0gS37><{Vr({NqF zqP@wzGgHWa2vA=;sw{G8nZuG|)HWJ^uR4eQy}l2laPw-Y*H=w(E4|HH9{VVbJ4g&$ zn}wou$|1jV8Jzb?dXmY+7Bo~PA*@dJB?)_no|ke_Q=+HbP!a+h)1vqa2qMNSy{T%H zfkI(5_w2#ICu@}FZS@ed2Ng-+a@Jwy#oA1XB;?b2rC?+@S;CBrE1RQZn_4lSRb199 zrAeW!j1dilWT~%<2rH&eNi9a%fmrRoV!R5$ku?*5Z%o-~6x1UEMc)V+hs7d=g^-yo z0y&x@aos{`x;Okljuen&!fLb8ybm}*98R%A@{&B6V61)@%me0pwhyUw?_%P6hqJ}4 zew7#bZ=i#Ch`Wid2^dP$-GLMv&7GnP(D_Yj00a*9ph}pOVAVl3Q17lu>Fl(u&fT35 zbivu`f>J2rp81aU4xpWlOnQg1A)4m7;Zb0Jd(s@wCVjAIK6$TQ6W!&V%@#+4TBDB& z4TJ2%PTQGu&dwq}wz8lAwW}6tSD{Pn^^~FjC4@45A0B0)0I44=s5AiNyKIIJY(3xb z<6wZ?f!BKNYp#Ox1|3v$+E-CL-$iV>w2fm>farzsCNbVD%v%=NPH27%a@zv}l)>&Q zXor!^E}7v5xgBlsaR+PnYYqb+!y9X$v&Z;@{|&xM-WsG|l|yF&Y!|p{!;RFJ7&S0H{V>5Um`v`4}}TJ+(o;X>C1#_I$$o~ao#W1i+t zP1?@q22s0;cw0mPaDx`$2I1M*>+oGg9Dp?F@>xR-QXGh*UH}1FJDcH$#eumjqoJdR zDEU?(nhm)8Jay>NQb#GOIiOCYtYE*L{Kq0ZD$Pc0PlOKNNCDNd!P-;Z;6|8(%#W++ zcR63{b*`IsN^hv)LVnN3NFmoVX8p3t120lZWHXo0Yn(`?6BqCwDi@7G6QPQSJ3-yS zec8}QJoZpU14U3U#Z^zM)Jy7z^imm&uB7+vG zvQC`5cJa}e@@hpdF+E7{PQgt~LZ2s7jNLuo(@Cc_efr!}=}X>OW`%frMf^K8N}PMD zN9pNtw_G1%OEVQ^>X>Cz+*S%y=c_R>pO+Hrd1Lh$Jt81F`<=ZM_5xg{qnp~n*>d=S zMc*UcmWHR7&8Q*e&5*E{A38+_1IpC)xCh2OD+78qaHxbn-$eW&@`&CC(8_i&z+iPo z21hF}yJ)-*h(;Q@#W;S^11a~Fcf$1Lb9!(Ae#t>)afi8ZoNndd%a>QKTw(R58ZP)3 zJ*oxU^4f2wznrp0tUpq9;CnH-S>Q_|qnXLx5oBosiBLh(r5x*d)|KB2-eu`*=AIU= zW7{I1gqGlJrnPGji1lSKg^afmrM8vw>5?2=SXK^8)?tDk&tYYMSxj|y{yF@Wncq%a+NbeAFf3W zh!Sdl%^D1p{L;%NZ}d1s4-O#`U$nBhR1R5n$bBv;`8@+&02@?K56U$_ns50ctp`<} zXb1J+C?iP4W={`l4HI8YN{)-J30C+Sa$|}|#XdO?3eD|O4+c*?qkLOyUB$UDQQ39m zH?u))NX3(GPeT*JE0&I&W$mcnLd?}BIr*rA3<}-D1cyvJu;?!eJC7jU}jPX;5t?^X+b!pcz zJ_CFGT%W#8ccu~HW3eLppon($Ey`7Vm>PI?!W?t26|Hx&z2d!+w*l*aQ@U!F=Vjpt znac<{kR*2F{5pDy4Ty^{wy9Ja>P=nAeVnbv7s61}!loghEnj3b6@gE*rW(i$DDu5I zkJD6WZw_mz#jBbfp(aC5hbvpyX&psl2ekoD5QFEDO6lxh{H!1Zr!dCMim%T>s{P39@cm6U+kywAuHIea7fM);dD$u!C#_j;E>1eF3P?`&Ou7+lm=*)jpacygYJQ z=$a>N%H)v&%3#X-(4bBMTpq~~jT^Z9e~?1HsYUDRp?P9&b? z`ZL7nH-r_^K82Dsq^Y_@5cj`GL84J3tVC4wF(;L>rs%5-?R11ZMrN2jUrs8mU|UG3 zJ{wvnok~y1(Yz>=L>?3_sG=BWbt&J@t3#s-W}|-iDDS?jiG006J2h5D>h%xoR&vLE z$CTAgue2S5hrgvMaC16WK7k4&GoV0ek&-!gtu7)3FB*#G zYCG!{MInLp$`T>%i!g4a9vHX2u6Ci<*pmrgq-3WuNGYK07Wt?QGEupl1xMC>K3lBy z+-MnxPpkTMeK&xeXG=`0cYq?s#qfqM%j36qHLS;IK}@!a^ti_I<*=;VRL%qq!w>47||x4L|~oe7XMRv3al*SNSguWo&Z zDEeSwhZrV4QH15{xUT{MZR!3tXSL zyp0>6xf{<$nSmSumP~EuVodiSBL>s5st&SC@5#)C)M~4n_f!*giaHceW4G(IU8u-9 z8W04vd@`5J=PtwWu;ww9lyiB&#au1{WCGU+>SaS36l$GubJGKvT@f1Mx12HNiSS;t z9&C7%S?PY2lh|SHudc|kFXHbcw%GX@)U+HHv&s2fdPk;94ae2A;k{T4BduA7J!3t9 z!0xM&y>AMiWWNi?ohPhyZxnSSfSxohrfh1PDANAIH7iC3J?{2?5hAq zK4Z06dsYhn<{jyW5ig;hx6m9yzjlOc51VvS&WJRY+j?{Us8g)#%To%S~<3I?8w0b`}Yz3 z1!a;^_DBIw%k0s?F1AJ7bXsGksQxyM7|@g*ku03HyVB1xYpq&G*iC78fh54aIK`Qa z$QxNh^~*+^U)FR{&)l4C9X`0We{OYdWpVF(EGwkityNY;(|C;;k@RQynld7s{nPos zdG;k zma?!nmL=Pkj=IUiCfte1D>h|Pg9JuP2d-LEc$o-3EOb0y67)E>z0iQ_jMJ#+xecwz45Jtu$ch1@8A*?6X+ z&=gJQ38g1rx$U-K+Ee+{@iv8C)_$wp=CqaRUX|MNC8O|)My%V~>e>`_CCX&Cd8xK3 zCvQ4lJ$mF2ZOW;7N^^TQMJvtt3}F*)$0QG%@|#*T(v>d$O!5~*f9z*Hm(ijHG)WhV z=djsKMVd1Vh9X_Bl%orQiga%O94yMp^3vi$9aXw5z2Q$wHe`pdgS{yed~Lu=))GGy z+V?_xdemd5HC0U6#mjAWv53sEpTynfk&4>0el00PS;o=ju?uEkk0mqKzrf zO2V``)owCX&G*NI<~8f5s<->*+lkJ18;&n@9SEPzoLie)6Zc_pVLndlY>(7HDz-7f zmYbz*PPCW7)qZn=HI}oeg+eEorkgYEAXRtSNO;jdy}Hg)guCvvN}Xk^{sFUojVWXU zb_=vIS&09s`Fud=T4V)`kFI>m&bxHc-QFnqU7(_Jw}rUHxw>n%%nq4W$y1rX#ssS7 z=~hVe_fw~SAT(}RFRR{t)3L$cBm)fqxFz)bA)%H@rx;jtR4|9AmCBwBl zMve(JkIYEWy#N2L|B*3mLTgL=gdXXrk%0dyoiRr^06|PdRv=)snaf$1pKjN z6?3KHIjgNLg=P?)hauG+eygW7rp`oHgSUZG$WF8E+^2ejx<$%vyDUT5{yh-yEG&wX zrE)ve-V0|IZ>jHWb!|(FH_2l+p0PwU#obgy<2pmtd>Wm7!u3bj>|7aO6l<=h44 z#^8|~pOnTflH;LGKaOJfIVfuuDiI7W0*&N;sNqm?RuK{6TzB(2s@gf>3dLx2aau9VBll1KI8^Am(!n z>o;#beNu(?Ou@{Z-SeU!+fivXf8TgI>-B3kpVs)azw%#GJ4A;aw_aQQw}Yq?wU74V z?Fj2#^9A^@Rwdt-ue4!1t5CM{6?B5T790WpM%NNTw^gx*^%2{zbcm{AVJ%?4o&vML$)QSX#+WaXk~bXt!V~=GLy8r?QY$b=54G< zQA6|n6!uVR-ybcH(RyKmfMf4Ox%;1t-z`zRVvPoQHA9Ry#Vi&+8#Hhn|EAdEM*_#@ zqHIGAfxe-cp_!?1G~NlEZ;(2Pi@oh54I3oX#cYQJXbS9pgsF*cb|_kiW7BO7qiO~o ztfnQMNZ(6{?qQD$dh%4asG2Co6ilmE`%{k$I#ii;+QZfNRa5y*s{VZhig3W_-!8Jk9W}77qFhqiUv%}qq zq1mAs!quSEEkIJ^*{Qo75u`3=_aRIqW-GS9S;ZWzP3yLntpCSdsoZK<@{pN6BE|0)zfNi6QRmm1ytV!-zv}z>!PD3h5(5lT>)Ohx-NqAv@aHV`|{Fi z3f26mP#+6WK!<(Nsa>;QrLmX&nikUTE5)vFj~ITggy4V`K{>swLm0p=7(Vymh$0Nn zSz`dVbe*obLj8bFXkd@D#*W{M3GhdJkGC6g^bJ&gBAbP8SjgtHxEci^ zi7mg+5O-~LRW3`|C@kB?b;fe+k%JJ#a^QTSAom)GX`RA!KOf=!`B3^%q8{O9q*`6^ zRQXVXi)myb%aosoi;1phCBo)Q@s@pFR1YLV&W72ZMEI)O1C&U9g!Sza5(1^}x;{?X z3BkqGhR{$7cs@Dx~ z_WiOl{t=_wh6j3)2!kh$!`H~&Y(_}~y7FE4I5T$P???~Z{s11=>ezkl1OY+V={6Qb zMjg{*kob8S_b$)d!H9+L#`?kE@gp}IXhj+Ht{!O}4-VNwZVrou+LH8-*7o3=L!uGD zN|rIMG1sy%Q%W$S&s=tuyZR-W7 z2=C&BNujS8Lf_T#zRblS;(gC^@uAncu|bUIB4NSQkf4=C1B3eW5#5&alVUqdUTE-v zh`|COzD+l!_f`Dc$4Y)zzorww83BM0vr=>ue=@os8#uwS{^uC4z{OHk<6`UxNmnC_ z1jT4%bKTb>a0^_k#JI5sniI#6g+!%3XO~yUBywCHX-|wnLje^fINXH~Aa1l@CCRP` zYt^AK&p+*al%k?zMq)3}rtY(@yB;FruERKt0|Ge1PZ8R5Zk>0Jjj_{5-O+!BlTzhzFn(vA%kpU z#p}@~n|gr>h}pvnuhh6LyFmOtiCtJ7)$InJE9|fj&(&S8ek@nNYc>yexd%#AVXg;t zPH$wU8YS z-U1Q7fkSQO9@Qgqxg@T`0H`fo4-uQ7`*sjmrz*w86iUz0-XlTI*EiFi8+SyIjqvX4 z{2#Che1!L4cBS6_S!6=$Y?tYJuMS!J^VZ9&*b~dzM{r#n08y1kg$mUm+*0{Z{gv#Adcp4f$B2c}usAyAOEn?UJilZ^+ zFVrg+Z=5Ll5wAQ9|IDR^b~Ir2uv3V8XU0U;ZkvUad>g>9MPi{++t^?*i-6WUPOPfEc3XN7QFo) z7oLc^U`M-6FfgxS*8X*T2Cm_?_W-|-xQ619f6j3}EcuGs$R@vtfE=oGs6V3VnkBv* zcd=|a)0R}Fls84Hi135LM;|s=Z*QsCt4<-7BcA(r8j=83QIDipq_7|{wMUTNGk}N@ zLPD@%dTzLf%ekSY1a==o{RI3h`hxVooXwOz;x3uY0Jli68aaM;q4ZAnVom^Y)#~`; zpc6wAQhOwk^aClzkukx!xt811&X>d*emR>KDFf~qP^QoEU+K|`cN>s04_HhlWV)Au zA%Rb^K>A#g8c10T8d`8d>|fWC1x&OEAt7iq_$@*M_E0zV;0r%!nwf_rb7G|7IQMuDuE0G; z)Jm{~#3rx_BpXIT0Ir&X^Q)?YGh6UYDw(QG#qr+bM-QVOUz0q4n5t)Lvfd?&15O6Hx-rM|?n-q6vZ>gK>nz;PC5fpJ*HCEqEiw}+RC0=WDFkJ>=;+Y?hpXhuvmupB3s z{f++9?ajnCTxZ-KGekvU<|5<)Y>xWe1DlJ`SO;@XtwEy`X9ZiA`a>{23dguV;cR&t zF$ay9%T;npY6IuW8?qYARxJKpkQS{CS+N(Lr!W{DWKQkpvllrdCqvF!Z#wftA41S+ zcnFvq1o;;T4Wz6R4{ItaNDoA%oABN$S@inO!#pR_r-6yw(gkQ&@9WEE`)2!i%Cg#+ z0oqlzJ=;DuHZoGKh)MJ9@6Xyh>I0A31HOy~Y_qb?zi$7)SZ6Pz!AXr+X0AJ)dtrDm zMh+1Ce;VctR+$_Cqx3N`J`Q9u=`CbGDrwKXL*bL71xFD6|kcE2zz3ZE6qA_TgRYF^Ml**{bJ7_W# zP-T}Hb181tVhu)c)HD~rZvRl53vbw%E5E6baVLrM&2b+gR^`gP1880(%GJmPFbFOo z&b{N{+e+zjQh+%isar}?W%NfnjvUyBj%m@8>I^tTL!~Yal8~m02-mT`k?>QNSn-<( znV0}pGUy8s+r&HsWmHgikni-7uNEnG6dTRlRL7L~!~^K0Z(-(0t!oga^dP#}UUBV1 z6gp)Vf)s^JLP*z4Sqs+Roq3`SC(Mi^OKl%TN&(9b{{iIRqy7AgBGQW&v-Y%4u~35#7{_QLWy2iz^ZbDrxa(c2#vRJdjkPkh)+5s>v0|KFA{83rXq# zV>NQC%hp&m)&vJS%wCu!N>0Emc|5LTlC(bix?U@4je`qt2$dp}Y%N^FY&N-t6qhWL zR4Tt&#KEbRJkI-sW*YB6>?B*}Cq7+u6_*cSTI6pMFr~#pm zSR?JvV%+UkKm6H~)#C_)bat5#@Tru|BOe46oG@j&B7w(6t5ZF8%?``}iyajs1)%s_ z?RL9l{@o~or7}Q_^CG5HDAcy!bVZegI8Nf)ENqFhXur}uQsI6H@vfm2#cz;SUNt0-$^RZ6@Ucy0+46T~y=QV`5m*JDZ@9ru|QSdXcM4(DwGAsZAIKyhA} zqhmtUV{VyxOiG!r9+TQ^Xle-CBO?()y_8iwLb3WGB(xd^6*P`az%*i!DTLWNRMs90 zVdSO)b*B@kJ3T~7=i3~vF9-n?ebE&Hje0KyYHl{d6$DNxfKyf{mnWAbZyKSrwJG&^ zsF`l2i6=47@@3rIrj48G!Ryu`{!)B7s@Cg9zZ|r_i&bwI{XPzkH20)-PH%J$4K=5wk4uC7e#pxXS%8K@OuZAU+O7#8vaAujR z{X00kw*6&h$CVwyHsJt+v49+E&1Apg3RfDNRPp~j;wOH|)gBbRA3(X#x?ZolY2+!r zb(c%z8mv1X|Mj|K6+ZHnh}$Q24^0nGhbeDi-Nlr&`eo21*k9OMkJw0otJX2F%c{P0 zp0zew$3RGE&y?=f%Z^6O>}XTWbmf(3()mfG0VO>V(xTqJYdz&cEgC3!^;2jxsJqHo z`5I5*C4c>E#Ae&e0sFEF2n`1ZbSe!~a!DnSHC!k_X~f!Vg(r7VUn~ph3~pf+O6dZM z7HM^w-eDeV@{qa%_SLAxw|NU3Un7IZ)p{+%?iEVe)<(dS;>2mteKvF&4#nBO=1zmL ze|1W8{qyKL4YY)z3f+3s8CR#P;w4q5%ifU>1ZH&}n8)aup<$#~>1Lr|7~KP${0b6< z(BL3EFr0*d28Ue!Tq~DBt(gWCohXhms?AM}4M_g69n13at1mz5L$RnUs z)b-;ps5^>y5?>-^1wSx%+M*cHdGybx+07%7T1EFGJjBf7TwEOEVzqJwS}$bs=Z5CQ zal|gc3()HURF%NwTeW%Nj@iDc&mmt`vf+{OA@*5cch?1dhR}YZrGoymoU6(jS@-B$CT6d=ZWyTkw$w|Q~>Lq=s!%lFYnWnQ` z^pR#9(W*pf8U8eHWt=LC~sp7Z3j87?y?t&61VO}1MsZS;_w=RtpI zlsVSmJd-HB@nOy$=LGAs$7Oh7ps7{@tWQ;e~OZP=NkM)%3AAlJx=bc;!SHbF?39^wu>IxoT!+T7K%eaChAOoFrX z+76kGiaw~TK283LWhI}gUU|^k%@eP@`Jngen-3PGY?x9AQlxWCLecIaX(S2L<5ib7 znie@B-VOQfw_f|G=;^aB`1|25hzg8_6S)$iWNYU zWxuq7qqx;pDXGxNkV3@`LpK~gh)@dvZ&D)>nIEqluRcA@Xb_j({Ecjw`lcQmu{**^6V z@3Sv)wrOxx$Ka+zC03lI(@=p)VJdc zYf-fwZ-g%SHk6dk@Yx{LNP9X@3@nue4*Nh5OUM2vZHHLP9YaV%J48IBpv*I`67Z7Z zQkk%%UaA-SL2lzquVJJLdC93qraj z^XR3eJ5pYiujxPDxe2&&yilWBnC5T{W!!-C*W&e>!GvUHu0-P6(V>0At1pDXb;{ZO3>~`$PZWu>w_U+Ok#?eX%~^2% zq7f%U#qB1>)Aj9x=v51NW}+M+`?RW}qY=w*6@7fuo*AV|RqhYX5AO*R+uSqbhKFpr zn|gOYkvf$3ZC}URCL}5X)$b-xq55hEv7`9yGfyBFtp$a7G?*0T(U>vX1B3vox-$|I zYI=F1Tzn!`?u2tza6oeK5*7-({HlLFcDW!{#(y#V4O}b;kmaH$q&m64RFT9#3qy>2 zPzdl3N`sBN*NoH;J4c6}~6JAA`4^obo zaM%)-p`A$}S(#2Jv3r+H!h6FZZ9v|TkEnIotd!f}0bzXtEOHY#VwD2Q({50=ur9yg zdtiw!EC3$+h6S9;K{dD}EjNfK`g(hK;EWs^K50)t2YQEwH&Jp79%E19enXt5i&Wmn zDL6)q;SxVb_{!S*N$eWq>_0k2H)*b->Zh0hXg2D~gtzSONFo*E@>YK&Z`oi6&StYE z1k|Ncr3BWVG_3vcZp6KoDU`7sno>u42ntG+yVz@KmAi4}|FL`xGy%l%G~5T^)x1u^ z?>T1uo9ZhK_u%?~dwGw0`Xjjq08Fy41aIB_5Ad=8UW%BKexm(N?Vo~pF&_W1>30i% zSdpN6HtX;p*hEl=4beUVC0p!QnY7mIUs1Ak*dmM{4vAC?w}>tewQ#vuHxPYBS1Vlf zEod%O2AlTHz&$KrvuyJwEMY}*D49y~#38+ zZ{&F;>Ik3c!~o>JRbycKJWRs2ei3u*bU97>UFytWlbU9~?qqNBn(a;LAuI{M4h`@T z&|+pnW0!}T&%?o6gr>9EJ*r3K^15@`)5F`KfwxZzyEpEI%$un>g+?nbzwpFAv;?Zzn}S7ZMITU}IZxeH3WX*`qB+S30Kba`)Z zE%^(*hglrT+hr{Alk@hxD)d;k`WvL;*cquxXIz%PzLsRpM0F&;w0dXK#_=0ALf>x-W|=oFpVQWd&pbh= zeaRz@j(RqYPIE*al8y?9r%xp#yOOc-Ycu1NZyes4O~XrXaxJ`anek9hbd*00q&w<` z2RUPZNJ}(Y+(KLlc;1>HsLf?pG_c04LIN&#bjrD6c?>OlL$V~s)7Db#Ym<&r)If^k z{NXT7bcEl7Wr~{k5K&Pd80%AT_Sq>7oc)6~03?sDpfux1o*$j8jaVQo+4O%6jT-^~ zSLcU>$e0f5D5>Ic#xGdooiz6_gA8zf!`~-IeHCn_j`F05SE==wUJrt=GEEKvGQ19h z;K~{P1Y|&aD#D&XV|A1<&14|jNf+dTC~PeUC=rMuI_RneY!bVx|4{jAvjCByuZF*# zueQ%q1#s6y6LA8LLsmb7^E5MMznX-fmZqQ9{Ccet==u8Fx1-E!s1h1F zP7x-;W119tANh9xB8wIr;au;uKVYJ(OOj5MOCI6zTBPo2Fkr)WX%(a9r!W^4gE)>Q3MAQLhyqew@2u1|D=Y ze1i^p8T1p$bLIlufLt>v{fhwXT?cR{N6MyZi&y}9tS&kV$2tknipo$0I3nn`Y(CaF zH^Lil$bkqBIWC9k$;yc82)B|BkWg|N9L;BV>`DnhL^L{sFnOe+ajYpM9loK*NJ-Sf zn?VO`yKle&!;XD7B@_P)+uml4DHI(WU2YU^ z%AtKLKt`Wo3!>U{@rI90tFS<~ZjKF6O$~97&L&n^&y%bL!T%Zo!D!akRA>E?<)19S zWKC4itgdhdcC;{AQ5$PW3tQI^B_Y$Q*Rj%_6KZdF%tbD7fLwwMhP@7OW;1O#twU?j z;M%}$_EZH_&=v#*E_Q7+G<7~&qDIa~P#p`W=0oYGG3&s^bi(NJHXWrZWdO~EU9!+QX$S5cNn)k2(L5=fwUlW?!d3B6Z$))k!^(j zY}PC%_M2Uv>4(nf!rBcMj z#q@=`7ptWbeKwa085_pUa9JC>RGI*1_*lGnMI^`z0fKz4qaTrZgWh4yOAZ4W<9V}b zR9&!)4<+{6a~9^HHbBcv0;dkJ*j`Ek3~NPZfa?PgYQgkr2NnhHnd@lpD78TcxY&qw z9p)YdlV~sM9Nw?l*JbG&l*HIY@5uOxVU)85h-RlpZ(;OY?1VknDl3`%O=l`%jXAN6l!AHF84r|2zw$g!JF7F8e9#jrM1( zUH1QO_1RyuCT!Fq+x_Tg=ilGLLA%%=;b$j>YZ6wsGa~ok=U&{iEZ_0-sD-)~ym$}u zdJgyh7i&bWP2(Q;9X|Kj@4@R+xF5%o!Dl|JW_5tPKKl(;Um}O!>fhVX%d>mUe>>xh z=WuPsN`fm1`x;`_f3-SreUH$BG26cndOl|>yt&+(q$D`V&LQ|kLh&zIlm z-^uu6p3mRN^Z$c2V=r5G+W)~CAP)@hL07l^dGO*nYh38XZ=4~}`eyKQ4%gmp&Dn3a zdYoUfcFTYNB7XZy>yYqq*y^|WThg%`*qPv!^$F;q$3Wu+@SE4Y7j*nQUjJb2#52mm zAMz;tdKkaqT#^6&SMvIoaNjOFdHt{P`YT)q4XNjgbLM+tO#9`(L-&?B_>t9@Oyl?D zcic-q-+w@hOd;5)8YS+iKL!e_H?xpqS@=Ve$ch7SE~`{%5Zy=j&0e+&74 z)atZ8kI!eZXZtRI9^GVBs1uyO#2Nzs&9lOPDW~%6ui!VgU@iR<&dSv<`>R&Pyqq1l z4_;W$gQ+h3_D%52{}?)xufM+j2CT_`dmd{^t(DZj_d;`%gex6bdNgHv4Z z&YLmzpTplj0YA;(C-M1H`0l5yA?WMfPOmjieSo#z=iG&R*D$uP$;%Nv!GF7CO*#kg zTh4)!L6J9CpHey%6-{ZF& zH$LN;>Uz?}YxVd1J;vRa_+9+H0pIKYmVd|n67R>qy${zHaoq>;@B9w`?fx~_gXY8~ zyfB}d{zg1BV^Q?L4swhU8u7h6i?nbYJMrRYj6d-fynYemYQw97Ysr@qUgloVH{hH1 zd+O})Z)Wk`9A4xH{w;yuBw&X{jy|pa@}BZcjt@RN=CCjEDSU?9!3KCQexFs>nBOP3 zK1l;#l+$0s3nxN2yf=TVX>s@&`qKFY+|N9Z*HT~N-<f+-DZehcqrpON=ij1~mbF>wkqpiqjD>g@4u{qj`&CynDj<(xszy1x_)$;Y9$9qNI+pqr` zKF?i$0`Ir-9izp+Vzhiei}w-yeiQE%d2he|endC7@-u$J_p^APlHW|pZ>I2+_gho) zn<@Ftl>BB7D1FA-11k9b0N*iwzMq!&bMk&3@AKf#!+6ihd)xJg@cF>?Kgau;ydRS9 zZ#S~XK*d<%+IIg{TBJ=jJ&VQ`-Z%qlYc#r_azzsl8k>z#=j)vUy|`J z$@mZ8H&0s!K*c}ey&|9Qlg|(E9Z%%@X?eeu|B7q*epcSk$@k~+z9#osll!d6eb&Ge ze$V@?$$i%3K5H1m)A)w>S(E#$VK(_2-sceR^UHXz@EyP8`=-2~#rr9t=#)@&N+>!d z6rB=^P6xzZnys~(W6 z9+0aZkgFb$s~(W69+0aZkgFcxRrWNl`enRhX6`H;T_r!@6dkst&k}EE9Q=$q5bd`H;T_r!@6djD zhxW7AWrXW8!gU$px{PpLMz}5`T$d4U$S*hKmmBiS4f*AU{BlEnxgo#Y6k1TjfoE+B zEt^8irqHq}v}_73n?lQ`(6TACYzi%#Ld&MmvMID|3N4#L%cjt>DYR?~Et^8iS$XbR zdG1+x?pb;6S$XbRdG1+x?pb;6S$XbRdG1+x?pb;6S$XbRdG1+x?pb;6S$XbRdG1+x z?pb;6IdJAV)N4`p&WRMA6Dc|;QglwF=p49&e+8HLPT4yzSDlxu&dXKj<*M^?)p@z< zyj*o&t~$@F#Ctet@&8_JJ#2l|p0hvhbmM5bJDs;Cs)<)7-jVot;~i`rk){`U4yxBpf9a~(4sw|4wY$Co;t&f(6(otHXa*ZD-}Uv-tc zX1ea_`XK)AnH~8ZH|}_1N3DCJ`)9k~-*c+x;hvB8{7LV=-WT=0t@krKPwu?B^Y8o0 zeN%lm_Pw(2$-d9`AKo=OFg)<~fhPyPJXjt)G5FfSj}0viePrkhL*E;o8NPG)^}`<; z{^Q~Aj?9l-9(miy6C-~=+BJG&^q$e*8~vNn+SuIKrLkWadwTcb-EY}_b$n|4t>a&v zI6U#u$?nO!CqF*rOkJ9K-P8xCJ~#F4>8qFT?Hy*n8 z&^r%3edzx^+;{kv!w(#O`ta9|RE``z@|q)$ANiZ3m7}je`mJO49s5@GHPz>Cn7iTf z4UgUMLQ&x$&Qm?>c_+_|G2y$nmSkYbWMU+eKhi-ZN zmM`4$+?icxPMmq|nU9^hdgh0>cHg>m>!n+N;nt7c`la>s`oj9{>+f9uPwU^bCE`=tD31^4a^(e)q+rFMjx3@!XT=&tI6k zz3bu~7r%VRbC8*RS67H+Og3 zee2z?y!-Pn&A)Wxr5}9h=U)2ld%Ev=@jbtK&lg^nf7y*Md+p1g=bL7sZQ6^7RjF4`3B^j&P%2=-UZh!C zLQ9)A2_#h^r^#s>Xp@qpY;K5%SP>Nw5s~Y@AmRxiA}XRH;)b~IiW@2_A}-JC?|J#>Z99MZ z1=b5*y>Q%xw_bSoqTof_=2y*Mb#ea1^DcgKLHU9Mm(*YK(Zb4w>ZLiCzP~7b8NJNE zxc}nb%LiY6esA&$dPVYzT}w)q%)63Y>0N4AdgoQ;SL?3cbj_?~CoEgK?BKOKmruQ} z;JTeFN>(gdvG4lv*T1{6@&?llH{Wn*Rn@BbtM=SD=*AVR^H)b#KYvrjP0MdOv}XF6 zO>2Jo``();-u(J43vXR^8@+AGZJ*yh?)Ka77=6d0JD$CB;GGxVx$7?Ju7!8)yL;T- z%kTdD9@{-@?>W3Sxpv#VhI?D@J+!WB-TZYw-&b|tocp${cdTEy{)zPm?zh}O_5SUu zL3OJu)t#x%)b!eK43VY_;F9ek$wnKjRnXLmj~^0{B0?|y#w3l%RcdEuwsExWhBIQYeddvf-4 z@A>2<$4fh3u6lXpD<`}%?^Wxoy|3eury}kCGs&{^V zx9!~n?@fGf^ZNzw-}=FT4;Jq&-@D{P^5Nc(T0XA&c<(0-pXPkJdEeB1pL}-c^OavL z*gx^hiZ5UPYT{R$zaIMa`U8Uwtp7&(X4k>;gUb%?|F-7a)!%-9sQb|F?<&7r^1bzY z^@jmJ?E10f$MgB$Ww;*Wl^oqkI`JOLId}`3;u|k3$#l%$nmq&au#`x!D06RQp{Bvp zY_d?~;|)Y|rJ%F$trp7!t;79ARnU6;fxjmOZNU6Jf;QrtT0RyuzGM^z3OXCWqYxXaY0Z{C$IthD!Z z%JHLQO;+NGNGvLG#iNvGvRK_@DH)f;N|zj;A;sE`-r#0=u2e6_<<^MOhwMluyT=Y6 zew5}6@0Qz@#BdRre=qm%Oa82d-^yhg#^Z)p)ggSUQo>O`2LCGYs<{I1(2u}WB3?3= zbdwl<;Y=ZM(nTUDE8)3P49}L5B!RRGsSsW>OT>dR3Zjf9NlZhe1NkuKbaFifB@;rT z9j!6xF8nY{Oy5P?xc2YMB-Cb}nD+$!MNp$1`B|KgptgjcKi0D?Q%ft>C5HMEdWfNC zW{V-KEwjdQt;CHvtbMG`F)|zTC1S(6H)Bpa=|M_HiBTw7&f{|?Mkjz;c;Htvf0Rl`P)2J>v@P@g?Bea2fq5|=`9I&+&8RsS_3F6= znY3cu6m09!ay!st635V3{I<&QKiN;iQC`NFD;S00zZ*UOiM{_s=l{D7|C7Bx_81!% zYzEE1;~L&XWdD9Wj||kP-==u1#8+zI+N{H4o`FC1g|GKz-)_R=TRz)0#HT<8;PGuB z!MjsyL~FI2dCjNw-n#%T83kNxL6BL zCnIqrj>fknRN^Wz7RP)Q{&vwgauyj+s&Ss!iGw(CWvInHAs3m5kGIw1ZchWw4mWAS zvEjkl;vJfbhgyIb$$oxL?=E%||bPktn~lKaRrV z6ZsV%xXHsW9Q+0P!!a-bj)j5vI=lin9!`K0VG#L=`~wQ%B={?w45xquMKBo5Fa(NW zD4a^(fD+t=83v_zHChH%7!Kty0xIyXBM(CmWN3vD*+)JjcS0BxXoGh0Ci#%OL*6Ctk-g+C@&R<<9orir0@GmzbV3(I zAqL%K1KCJ6lLyHTvWYxEo+1m#6XY^{zF{ZXMjj)Nz)Xlk0+P@JvtTyNfw?db&V%#e z0=N(^g86VUEPzYM5?BbA!Xmf~7Q^LaC0RvoAm5NX@LX;+xrU zI=Bzk!~LK_3O2w-*aQ#2W_S>`z(cSV9)?HYQP>8L!FG5Yo`5G|2RsEk;c3_f&%m?r z96S#%z;1XE_P|T!fWt4ya8{*Tktl#1Mk9n@IHJ1d*MU)2tI~S;8WNKpTXzw z1?-0};VbwW4!}2X5Wa;&@Ev>)KfsUhU+@$B1Ac~o!eRIq{DO~85&YT@{+bVdD@2da zav5nqnoV`Gieq58y!c_qT^{b zwNX2DP$#XSwR8e?(TTK<*3(I}fi_Y%ZKBQ8L%q~TC(|j^PXn}to=wl8=i+|KG#aEb zZKWX^rV4GN?X-hN=yW=RcG4~yr7_w~XVN%L&?N1lv*>I(ht8$*=y~*fdIA2T&P8-S zy_hbbm(YduQo4vV_rSvL#HNA!|qu0{q^g6nNUQbuj8|W%}BVA2z zqHFM%d2Xh+;Mf0e!(TkQ1AjjCE_ye;hpwgf(slGcx}M%oRhq)*H#gEv^Z~k=K1jFF zhv-)NFnxqRO1II+=yv)zeS$tochINkPWm+6MW3P1(&y;&^aZ*b9};|#?lJa6BX}Nq zhM`Li#beR@ZY3Uxh4Iuksl=7Av0BSE${HG~TjR#_7QDufv)-cB&j^Wue zQ_cxxNP{CJqh&)_0|&a1lgKeJI)!~aQDyE8PR+i;A;+09l7r{X!nDyTyeb+RoSI>U zLr!f*FsD63nriWEyi3;VW@_)l=q9wvaa{){JQ5=+s*Mp*7nfF-h}Kq@@EQ?qb!CiG z*F+kbZmR2J)ik3IW2l!yJxRrYC;bSf`aVUb&OVHxUTa7v2VFfn&~;*BXwdYdntnqc z6;reiV`$Lyqa3oF(e^AQ+HPzVA&!Y=HEPX@amZ`z=!v$=@t&?uxhI(y>&qFMHNSDq zZ*w14rg$I5(5(55Yv9qe5}KB`kDw{phcS3H@gxVGmvuuD6N4`q=?p7|9u7vIsC|#9 zy-%xs4+p(3j@MuM9+u|$`qn+Kr!QypiO%cMFn3BQ5)buswRI|Ua%cCU1AXYZM`%Nf z)~0zJa#}K7pEEB*nmm0PXG-*8_`s?dQ7zD>cPO1n*)XL&F5^_1t-%z{!)y-OQ^FCP zeu+pTdv=;K1T?|998B|+cr4MwXKUQl7VC*0VIs4XG?SZ%%t_OE37omn45vieJCbS6 z6pchPO58SHu(FjPo{JMaLnmj)(sW+31FwtI9IwF<25XRJSPjy&R)Y-3Ymnx64bqIx z*%Obka8-;LaYjF^L9!zf4`-u$P9(B1i)(k7cr`RSk=urj1#RN36^t&Cl;iqptK6B? zPvB_>PwRO)iKh)bZQ^M&Pit73o#<9V5xLVE(MNdhbe3jSTPw0^@KcMQ4*X2O&m{ab z;HMcs0c(X`o`w>bq70@efho#jijtV3ET$-pDaspp{ian5Y!zq|XcvfUGONKfhd@Q3 z)1>7qb3&bRm&mLUSSzqY-~@p#ffEJR39J`5NnnG(MuBeOOgmbL%%*&;1~YqPH zVIF>mNLk<=Jn&(z<=|pFORNJinIb*K*6X+;T0qS<9`}a>-gIY2?Frnk=x|$Okv_ z8di&ZyWs7D4-0gN{IEcW$X5h9MZO}?Y0~V9A*MNZi9(l9suz5{;3o-wlHeNz-yrx# z!8Z!tEqJ#{v#$*?;aOwywQ6L>nI_mQ6q|)1kKjFm_X^%Cc%R^Xf)5Bjpm*{3yLi92 zc#pey{9Qc$E*}4hT&7N>Y^2rk{;K2sRmUakxMUsgDZbQT&uCaJuvMT32YG9D9|mOh+u0@GQrl^W+Cel=oRP_7%=ix z6&tK!wZK+^Hi345ia@7HlNSxtm>N;&5?C*AlE4OmjRM`mh-iRjB+~$mZ5FZ~fnI?= zfdL~wAYcPDtQOcR&?e9>Ff7m^P!Z@fY5Jl;8dD<*YXx=)oFLF8aH7CEf%O6>32YG9 zD9|mOX$=>dP5GMBOaL^tSrmH&dIkCfrUTHTZ{&l#kxz$4J{=nQP;cZzy^&9iMn2#h z`G9Zai@1l9|jB(OnXqd>QCA_A>BY0B3y6KIWX7CIh*UV-Tb2lO5u zDi05^hX>fh!{*^(^YE~Fc-TBVY#tt9FW2&NEic#daxE{{@^URN*Ya{LFW2&MEg#qN zaV;O$@^LL6*Ya^KAJ_76tpL{w@X`P;4e-(yp5MY{tkIs%PLnm6Y{M&wSVtt9#C<>9 zR{Hf<+|&E*zdg7MgCBYkZWiJ%q~TuSn7%Z@Z6S*kR;6H@StV}25-3vvGbDApTh$G1 zQFYF<{YB=Y!d}0my50UFb$p;uQY#r%83;&fj#Cb+C5+8+N@_VH%9+G=w_j?LdV6IQ zar=XqBXJ={jb_y7U||qnb6Kd8(m+7?M(5Nbp&ebZj8)Lv-F{VXwy6fQt+1#lphB=r z&9a!WK2kWPZ?#FRWJ3tV{(jK&_1Ge((WTg99uuT$%$Uc!p9|^N9pyo2J z8M$2K%G7L&v_(f+SrS4os>vRddV`W`GTY2$YK|pE^6Wl;DlgBDMr~?#X@E6`7TZKS zQaMPcaxqb%z${@!ux==!E4KAw#L!~DVMS)tP1D#XTpw-lvH;ev7Hd@-ROh!Ii9?Ez zW6cf~>?#?z0RS*$Woj-~NAL9diJE7&NkO#wKz=^phO^Dq8%*WsO4Ued;b3f)2?cXY z%hWte3K-^FQk3CeEU7Gp{VgdS!(%X93k_jmk zsODiR99PaGSlqY8zbzVSkw)>^a;k->S=zY836S>3NK&wguN01P=E~GiI1X!7Vv(w_ z25G4v4gePrpNdu|3)fhNrfBf z(5yiLn+=C^HqLu=h0e@1K~-nRF^ZFelxm9)wFkpyHOnrCanMt{T!?fqfO7!FWOR&+ zoViA>EHtB?8rE~!c5VwzXr|BuPI6>09HpurXM~>Vq8=`7IP;lxOmRsoG#3SqSj3LA zvi3;mLqAls$6STY9L}@VY@8pGRAa`Fm16&wspY)+STic3L%e>gRE3MLHljpC(0wL+ z#aI~^mdYwPL*`a(eKL!HVs*;Y5yF{09nm0L>#+gppjTMTl9jc*23MS_fHgH32I7!D zJ(G=bKaxE%lg*{ms=tvr6I~vsjRahQu;-7pswLR_RsSacZ#ceT;IZmyC^OEYmLiO@ zsFu>S@!!XG0%qb+J#X)g{cHhOw-X8oak*qv5&Fe>|) zxzR{WX66_%g_&c7pP6IC8N6TEs7-ex8<9A>B`Z!HEnJhBoik9lf!Se1BeTN@H?zZt zN?a{)&CN`KbdUV+W4!kNHmq4^vIV8eTv=GuXNVOAL~W~CZ7Z=#Hdb3k*ja5E;b668 z#CQuEq3T&kj$yr#9vDuhI|g%Wm@Xq~nJyzHFkMEBWgSq&Mi^_G2vR2IP0Yer6l-P{ z7~x?S7~y3W7;zShxf6R%s=)(PI?4fyYRy!ng)wRc3ZKoX(~&xdcNJ!jMCM$JIy@si zl`&j;8mE|akW)-lwy5P9(N@NA(GaJYXqZz>RI#WdGNNsa;iB!FVxk?KVxkdCsoGCb zvxd0mutmF!)NLWVn*Aw&rGba~;R8$|371C)9+A!6>OiL?)v5VSb*jPB;#Wr&swIIS zoj@h$M{rK;}Al%6>L8=Z+vu>b%7 literal 0 HcmV?d00001 diff --git a/server-data/resources/[esx]/es_extended/html/js/app.js b/server-data/resources/[esx]/es_extended/html/js/app.js new file mode 100644 index 000000000..4a95fe120 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/html/js/app.js @@ -0,0 +1,40 @@ +(() => { + ESX = {}; + + ESX.inventoryNotification = function (add, label, count) { + let notif = ""; + + if (add) { + notif += "+"; + } else { + notif += "-"; + } + + if (count) { + notif += count + " " + label; + } else { + notif += " " + label; + } + + let elem = $("

" + notif + "
"); + $("#inventory_notifications").append(elem); + + $(elem) + .delay(3000) + .fadeOut(1000, function () { + elem.remove(); + }); + }; + + window.onData = (data) => { + if (data.action === "inventoryNotification") { + ESX.inventoryNotification(data.add, data.item, data.count); + } + }; + + window.onload = function (e) { + window.addEventListener("message", (event) => { + onData(event.data); + }); + }; +})(); diff --git a/server-data/resources/[esx]/es_extended/html/js/mustache.min.js b/server-data/resources/[esx]/es_extended/html/js/mustache.min.js new file mode 100644 index 000000000..f36565977 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/html/js/mustache.min.js @@ -0,0 +1,347 @@ +(function defineMustache(global, factory) { + if (typeof exports === "object" && exports && typeof exports.nodeName !== "string") { + factory(exports); + } else if (typeof define === "function" && define.amd) { + define(["exports"], factory); + } else { + global.Mustache = {}; + factory(global.Mustache); + } +})(this, function mustacheFactory(mustache) { + var objectToString = Object.prototype.toString; + var isArray = + Array.isArray || + function isArrayPolyfill(object) { + return objectToString.call(object) === "[object Array]"; + }; + function isFunction(object) { + return typeof object === "function"; + } + function typeStr(obj) { + return isArray(obj) ? "array" : typeof obj; + } + function escapeRegExp(string) { + return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + function hasProperty(obj, propName) { + return obj != null && typeof obj === "object" && propName in obj; + } + var regExpTest = RegExp.prototype.test; + function testRegExp(re, string) { + return regExpTest.call(re, string); + } + var nonSpaceRe = /\S/; + function isWhitespace(string) { + return !testRegExp(nonSpaceRe, string); + } + var entityMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/", "`": "`", "=": "=" }; + function escapeHtml(string) { + return String(string).replace(/[&<>"'`=\/]/g, function fromEntityMap(s) { + return entityMap[s]; + }); + } + var whiteRe = /\s*/; + var spaceRe = /\s+/; + var equalsRe = /\s*=/; + var curlyRe = /\s*\}/; + var tagRe = /#|\^|\/|>|\{|&|=|!/; + function parseTemplate(template, tags) { + if (!template) return []; + var sections = []; + var tokens = []; + var spaces = []; + var hasTag = false; + var nonSpace = false; + function stripSpace() { + if (hasTag && !nonSpace) { + while (spaces.length) delete tokens[spaces.pop()]; + } else { + spaces = []; + } + hasTag = false; + nonSpace = false; + } + var openingTagRe, closingTagRe, closingCurlyRe; + function compileTags(tagsToCompile) { + if (typeof tagsToCompile === "string") tagsToCompile = tagsToCompile.split(spaceRe, 2); + if (!isArray(tagsToCompile) || tagsToCompile.length !== 2) throw new Error("Invalid tags: " + tagsToCompile); + openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + "\\s*"); + closingTagRe = new RegExp("\\s*" + escapeRegExp(tagsToCompile[1])); + closingCurlyRe = new RegExp("\\s*" + escapeRegExp("}" + tagsToCompile[1])); + } + compileTags(tags || mustache.tags); + var scanner = new Scanner(template); + var start, type, value, chr, token, openSection; + while (!scanner.eos()) { + start = scanner.pos; + value = scanner.scanUntil(openingTagRe); + if (value) { + for (var i = 0, valueLength = value.length; i < valueLength; ++i) { + chr = value.charAt(i); + if (isWhitespace(chr)) { + spaces.push(tokens.length); + } else { + nonSpace = true; + } + tokens.push(["text", chr, start, start + 1]); + start += 1; + if (chr === "\n") stripSpace(); + } + } + if (!scanner.scan(openingTagRe)) break; + hasTag = true; + type = scanner.scan(tagRe) || "name"; + scanner.scan(whiteRe); + if (type === "=") { + value = scanner.scanUntil(equalsRe); + scanner.scan(equalsRe); + scanner.scanUntil(closingTagRe); + } else if (type === "{") { + value = scanner.scanUntil(closingCurlyRe); + scanner.scan(curlyRe); + scanner.scanUntil(closingTagRe); + type = "&"; + } else { + value = scanner.scanUntil(closingTagRe); + } + if (!scanner.scan(closingTagRe)) throw new Error("Unclosed tag at " + scanner.pos); + token = [type, value, start, scanner.pos]; + tokens.push(token); + if (type === "#" || type === "^") { + sections.push(token); + } else if (type === "/") { + openSection = sections.pop(); + if (!openSection) throw new Error('Unopened section "' + value + '" at ' + start); + if (openSection[1] !== value) throw new Error('Unclosed section "' + openSection[1] + '" at ' + start); + } else if (type === "name" || type === "{" || type === "&") { + nonSpace = true; + } else if (type === "=") { + compileTags(value); + } + } + openSection = sections.pop(); + if (openSection) throw new Error('Unclosed section "' + openSection[1] + '" at ' + scanner.pos); + return nestTokens(squashTokens(tokens)); + } + function squashTokens(tokens) { + var squashedTokens = []; + var token, lastToken; + for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { + token = tokens[i]; + if (token) { + if (token[0] === "text" && lastToken && lastToken[0] === "text") { + lastToken[1] += token[1]; + lastToken[3] = token[3]; + } else { + squashedTokens.push(token); + lastToken = token; + } + } + } + return squashedTokens; + } + function nestTokens(tokens) { + var nestedTokens = []; + var collector = nestedTokens; + var sections = []; + var token, section; + for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { + token = tokens[i]; + switch (token[0]) { + case "#": + case "^": + collector.push(token); + sections.push(token); + collector = token[4] = []; + break; + case "/": + section = sections.pop(); + section[5] = token[2]; + collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens; + break; + default: + collector.push(token); + } + } + return nestedTokens; + } + function Scanner(string) { + this.string = string; + this.tail = string; + this.pos = 0; + } + Scanner.prototype.eos = function eos() { + return this.tail === ""; + }; + Scanner.prototype.scan = function scan(re) { + var match = this.tail.match(re); + if (!match || match.index !== 0) return ""; + var string = match[0]; + this.tail = this.tail.substring(string.length); + this.pos += string.length; + return string; + }; + Scanner.prototype.scanUntil = function scanUntil(re) { + var index = this.tail.search(re), + match; + switch (index) { + case -1: + match = this.tail; + this.tail = ""; + break; + case 0: + match = ""; + break; + default: + match = this.tail.substring(0, index); + this.tail = this.tail.substring(index); + } + this.pos += match.length; + return match; + }; + function Context(view, parentContext) { + this.view = view; + this.cache = { ".": this.view }; + this.parent = parentContext; + } + Context.prototype.push = function push(view) { + return new Context(view, this); + }; + Context.prototype.lookup = function lookup(name) { + var cache = this.cache; + var value; + if (cache.hasOwnProperty(name)) { + value = cache[name]; + } else { + var context = this, + names, + index, + lookupHit = false; + while (context) { + if (name.indexOf(".") > 0) { + value = context.view; + names = name.split("."); + index = 0; + while (value != null && index < names.length) { + if (index === names.length - 1) lookupHit = hasProperty(value, names[index]); + value = value[names[index++]]; + } + } else { + value = context.view[name]; + lookupHit = hasProperty(context.view, name); + } + if (lookupHit) break; + context = context.parent; + } + cache[name] = value; + } + if (isFunction(value)) value = value.call(this.view); + return value; + }; + function Writer() { + this.cache = {}; + } + Writer.prototype.clearCache = function clearCache() { + this.cache = {}; + }; + Writer.prototype.parse = function parse(template, tags) { + var cache = this.cache; + var tokens = cache[template]; + if (tokens == null) tokens = cache[template] = parseTemplate(template, tags); + return tokens; + }; + Writer.prototype.render = function render(template, view, partials) { + var tokens = this.parse(template); + var context = view instanceof Context ? view : new Context(view); + return this.renderTokens(tokens, context, partials, template); + }; + Writer.prototype.renderTokens = function renderTokens(tokens, context, partials, originalTemplate) { + var buffer = ""; + var token, symbol, value; + for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { + value = undefined; + token = tokens[i]; + symbol = token[0]; + if (symbol === "#") value = this.renderSection(token, context, partials, originalTemplate); + else if (symbol === "^") value = this.renderInverted(token, context, partials, originalTemplate); + else if (symbol === ">") value = this.renderPartial(token, context, partials, originalTemplate); + else if (symbol === "&") value = this.unescapedValue(token, context); + else if (symbol === "name") value = this.escapedValue(token, context); + else if (symbol === "text") value = this.rawValue(token); + if (value !== undefined) buffer += value; + } + return buffer; + }; + Writer.prototype.renderSection = function renderSection(token, context, partials, originalTemplate) { + var self = this; + var buffer = ""; + var value = context.lookup(token[1]); + function subRender(template) { + return self.render(template, context, partials); + } + if (!value) return; + if (isArray(value)) { + for (var j = 0, valueLength = value.length; j < valueLength; ++j) { + buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate); + } + } else if (typeof value === "object" || typeof value === "string" || typeof value === "number") { + buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate); + } else if (isFunction(value)) { + if (typeof originalTemplate !== "string") throw new Error("Cannot use higher-order sections without the original template"); + value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender); + if (value != null) buffer += value; + } else { + buffer += this.renderTokens(token[4], context, partials, originalTemplate); + } + return buffer; + }; + Writer.prototype.renderInverted = function renderInverted(token, context, partials, originalTemplate) { + var value = context.lookup(token[1]); + if (!value || (isArray(value) && value.length === 0)) return this.renderTokens(token[4], context, partials, originalTemplate); + }; + Writer.prototype.renderPartial = function renderPartial(token, context, partials) { + if (!partials) return; + var value = isFunction(partials) ? partials(token[1]) : partials[token[1]]; + if (value != null) return this.renderTokens(this.parse(value), context, partials, value); + }; + Writer.prototype.unescapedValue = function unescapedValue(token, context) { + var value = context.lookup(token[1]); + if (value != null) return value; + }; + Writer.prototype.escapedValue = function escapedValue(token, context) { + var value = context.lookup(token[1]); + if (value != null) return mustache.escape(value); + }; + Writer.prototype.rawValue = function rawValue(token) { + return token[1]; + }; + mustache.name = "mustache.js"; + mustache.version = "2.3.0"; + mustache.tags = ["{{", "}}"]; + var defaultWriter = new Writer(); + mustache.clearCache = function clearCache() { + return defaultWriter.clearCache(); + }; + mustache.parse = function parse(template, tags) { + return defaultWriter.parse(template, tags); + }; + mustache.render = function render(template, view, partials) { + if (typeof template !== "string") { + throw new TypeError('Invalid template! Template should be a "string" ' + 'but "' + typeStr(template) + '" was given as the first ' + "argument for mustache#render(template, view, partials)"); + } + return defaultWriter.render(template, view, partials); + }; + mustache.to_html = function to_html(template, view, partials, send) { + var result = mustache.render(template, view, partials); + if (isFunction(send)) { + send(result); + } else { + return result; + } + }; + mustache.escape = escapeHtml; + mustache.Scanner = Scanner; + mustache.Context = Context; + mustache.Writer = Writer; + return mustache; +}); diff --git a/server-data/resources/[esx]/es_extended/html/js/wrapper.js b/server-data/resources/[esx]/es_extended/html/js/wrapper.js new file mode 100644 index 000000000..ee20f2611 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/html/js/wrapper.js @@ -0,0 +1,34 @@ +(() => { + let ESXWrapper = {}; + ESXWrapper.MessageSize = 1024; + ESXWrapper.messageId = 0; + + window.SendMessage = function (namespace, type, msg) { + ESXWrapper.messageId = ESXWrapper.messageId < 65535 ? ESXWrapper.messageId + 1 : 0; + const str = JSON.stringify(msg); + + for (let i = 0; i < str.length; i++) { + let count = 0; + let chunk = ""; + + while (count < ESXWrapper.MessageSize && i < str.length) { + chunk += str[i]; + + count++; + i++; + } + + i--; + + const data = { + __type: type, + id: ESXWrapper.messageId, + chunk: chunk, + }; + + if (i === str.length - 1) data.end = true; + + $.post("http://" + namespace + "/__chunk", JSON.stringify(data)); + } + }; +})(); diff --git a/server-data/resources/[esx]/es_extended/html/ui.html b/server-data/resources/[esx]/es_extended/html/ui.html new file mode 100644 index 000000000..1a45afd98 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/html/ui.html @@ -0,0 +1,15 @@ + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/server-data/resources/[esx]/es_extended/locale.js b/server-data/resources/[esx]/es_extended/locale.js index 4b5390f86..e47e4345c 100644 --- a/server-data/resources/[esx]/es_extended/locale.js +++ b/server-data/resources/[esx]/es_extended/locale.js @@ -20,7 +20,7 @@ function _U() { } // Has the locale file been set? - if (locale.length == 0) { + if (locale.length === 0) { console.log('locale.js: no locale has been set'); return 'locale.js: no locale has been set'; } @@ -32,7 +32,7 @@ function _U() { } // Do we need to format the string? - if (args.length == 1) { + if (args.length === 1) { return capitalize(locale[string]); } else { return formatString(args); diff --git a/server-data/resources/[esx]/es_extended/locale.lua b/server-data/resources/[esx]/es_extended/locale.lua index 440859695..6d628c4d5 100644 --- a/server-data/resources/[esx]/es_extended/locale.lua +++ b/server-data/resources/[esx]/es_extended/locale.lua @@ -1,17 +1,32 @@ Locales = {} -function _(str, ...) -- Translate string - if Locales[Config.Locale] ~= nil then - if Locales[Config.Locale][str] ~= nil then +function Translate(str, ...) -- Translate string + if not str then + print( + ("[^1ERROR^7] Resource ^5%s^7 You did not specify a parameter for the Translate function or the value is nil!"):format( + GetInvokingResource() or GetCurrentResourceName() + ) + ) + return "Given translate function parameter is nil!" + end + if Locales[Config.Locale] then + if Locales[Config.Locale][str] then return string.format(Locales[Config.Locale][str], ...) + elseif Config.Locale ~= "en" and Locales["en"] and Locales["en"][str] then + return string.format(Locales["en"][str], ...) else return "Translation [" .. Config.Locale .. "][" .. str .. "] does not exist" end + elseif Config.Locale ~= "en" and Locales["en"] and Locales["en"][str] then + return string.format(Locales["en"][str], ...) else return "Locale [" .. Config.Locale .. "] does not exist" end end -function _U(str, ...) -- Translate string first char uppercase - return tostring(_(str, ...):gsub("^%l", string.upper)) +function TranslateCap(str, ...) -- Translate string first char uppercase + return _(str, ...):gsub("^%l", string.upper) end + +_ = Translate +_U = TranslateCap diff --git a/server-data/resources/[esx]/es_extended/locales/cs.lua b/server-data/resources/[esx]/es_extended/locales/cs.lua index 6f04a2596..e99956585 100644 --- a/server-data/resources/[esx]/es_extended/locales/cs.lua +++ b/server-data/resources/[esx]/es_extended/locales/cs.lua @@ -1,218 +1,371 @@ Locales["cs"] = { -- Inventory - ["giveammo"] = "dát munici", - ["amountammo"] = "množství munice", - ["noammo"] = "nemáte dostatek munice!", - ["gave_item"] = "dali jste %sx %s %s", - ["received_item"] = "obdrželi jste %sx %s od %s", - ["gave_weapon"] = "dal jsi %s hráči %s", - ["gave_weapon_ammo"] = "dal jsi ~o~%sx %s za %s to %s", - ["gave_weapon_withammo"] = "dal jwi %s s ~o~%sx %s to %s", - ["gave_weapon_hasalready"] = "%s již má %s", - ["gave_weapon_noweapon"] = "%s nemá tuhle zbraň", - ["received_weapon"] = "obdrzel jsi %s od %s", - ["received_weapon_ammo"] = "obdrzel jsi ~o~%sx %s za tvůj %s od %s", - ["received_weapon_withammo"] = "obdzel jsi %s s ~o~%sx %s od %s", - ["received_weapon_hasalready"] = "%s se pokusil ti dat %s, ale jiz tento predmet jednou mas", - ["received_weapon_noweapon"] = "%s se pokusil ti dat naboje pro %s, ale tuhle zbran nemas", - ["gave_account_money"] = "dali jste $%s (%s) %s", - ["received_account_money"] = "obdrželi jste $%s (%s) od %s", - ["amount_invalid"] = "neplatné množství", - ["players_nearby"] = "žádní hráči poblíž", - ["ex_inv_lim"] = "akce není možná, překročen limit inventáře pro %s", - ["imp_invalid_quantity"] = "akce není možná, neplatný počet", - ["imp_invalid_amount"] = "akce není možná, neplatné množství", - ["threw_standard"] = "vyhodil jsi %sx %s", - ["threw_account"] = "vyhodil jsi $%s %s", - ["threw_weapon"] = "vzhodil jsi %s", - ["threw_weapon_ammo"] = "vyhodil jsi %s s ~o~%sx %s", - ["threw_weapon_already"] = "jiz stejnou zbraan mas", - ["threw_cannot_pickup"] = "tohle nemuzes sebrat, protoze tvuj inventar je plny", - ["threw_pickup_prompt"] = "stiskni E po zvednuti", + ["inventory"] = "Inventář ( Váha %s / %s )", + ["use"] = "Použít", + ["give"] = "Darovat", + ["remove"] = "Odhodit", + ["return"] = "Vrátit", + ["give_to"] = "Darováno", + ["amount"] = "Počet", + ["giveammo"] = "Podat náboje", + ["amountammo"] = "Počet nábojů", + ["noammo"] = "Nedostatek!", + ["gave_item"] = "Daroval %sx %s pro %s", + ["received_item"] = "Získáno %sx %s od %s", + ["gave_weapon"] = "Předání %s pro %s", + ["gave_weapon_ammo"] = "Darování ~o~%sx %s do %s pro %s", + ["gave_weapon_withammo"] = "Darování %s s ~o~%sx %s pro %s", + ["gave_weapon_hasalready"] = "%s již vlastní %s", + ["gave_weapon_noweapon"] = "%s nemá tuto zbraň", + ["received_weapon"] = "Obdrženo %s od %s", + ["received_weapon_ammo"] = "Obdrženo ~o~%sx %s pro zbraň %s od %s", + ["received_weapon_withammo"] = "Obdrženo %s s ~o~%sx %s od %s", + ["received_weapon_hasalready"] = "%s se snažil darovat %s, ale již tuto zbraň máš", + ["received_weapon_noweapon"] = "%s se snažil ti dát náboje %s, ale nemáš potřebnou zbrań", + ["gave_account_money"] = "Darováno $%s (%s) pro %s", + ["received_account_money"] = "Získáno $%s (%s) od %s", + ["amount_invalid"] = "Špatné množství", + ["players_nearby"] = "Žádný hráč není poblíž", + ["ex_inv_lim"] = "Nelze sebrat,protože máš plné kapsy %s", + ["imp_invalid_quantity"] = "Neplatné množství", + ["imp_invalid_amount"] = "Nelze provést, neplatné množství", + ["threw_standard"] = "Zahozeno %sx %s", + ["threw_account"] = "Zahozeno $%s %s", + ["threw_weapon"] = "Zahozeno %s", + ["threw_weapon_ammo"] = "Zahozeno %s s ~o~%sx %s", + ["threw_weapon_already"] = "Již vlastníš tuto zbraň", + ["threw_cannot_pickup"] = "Kapsy máš plné, nemůžeš sebrat!", + ["threw_pickup_prompt"] = "Zmáčkni E pro sebrání!", -- Key mapping - ["keymap_showinventory"] = "zobrazit inventar", + ["keymap_showinventory"] = "Otevřít inventář", -- Salary related - ["received_salary"] = "obdrželi jste výplatu: $%s", - ["received_help"] = "obdrželi jste sociální dávku: $%s", - ["company_nomoney"] = "společnost u které jste zaměstananí nemá peníze na váš plat", - ["received_paycheck"] = "obdržena výplata", - ["bank"] = "bankovní účet", - ["account_bank"] = "banka", - ["account_black_money"] = "spinave penize", - ["account_money"] = "kapesne", - - ["act_imp"] = "akce není možná", - ["in_vehicle"] = "nemůže nic dát osobě ve vozidle", + ["received_salary"] = "Obdržel jsi: $%s", + ["received_help"] = "Obdržel jsi svůj podíl: $%s", + ["company_nomoney"] = "Firma kde pracujete je příliš chudá, aby vám zaplatila", + ["received_paycheck"] = "Obdržena platba", + ["bank"] = "Banka", + ["account_bank"] = "V bance", + ["account_black_money"] = "Špináve peníze", + ["account_money"] = "V kapse", + + ["act_imp"] = "Nelze provést", + ["in_vehicle"] = "Nelze provést, hráč je v autě", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", -- Commands - ["command_car"] = "spawn an vehicle", - ["command_car_car"] = "vehicle spawn name or hash", - ["command_cardel"] = "delete vehicle in proximity", - ["command_cardel_radius"] = "optional, delete every vehicle within the specified radius", - ["command_clear"] = "clear chat", - ["command_clearall"] = "clear chat for all players", - ["command_clearinventory"] = "clear player inventory", - ["command_clearloadout"] = "clear a player loadout", - ["command_giveaccountmoney"] = "give account money", - ["command_giveaccountmoney_account"] = "valid account name", - ["command_giveaccountmoney_amount"] = "amount to add", - ["command_giveaccountmoney_invalid"] = "invalid account name", - ["command_giveitem"] = "give an item to a player", - ["command_giveitem_item"] = "item name", - ["command_giveitem_count"] = "item count", - ["command_giveweapon"] = "give a weapon to a player", - ["command_giveweapon_weapon"] = "weapon name", - ["command_giveweapon_ammo"] = "ammo count", - ["command_giveweapon_hasalready"] = "player already has that weapon", - ["command_giveweaponcomponent"] = "give weapon component", - ["command_giveweaponcomponent_component"] = "component name", - ["command_giveweaponcomponent_invalid"] = "invalid weapon component", - ["command_giveweaponcomponent_hasalready"] = "player already has that weapon component", - ["command_giveweaponcomponent_missingweapon"] = "player does not have that weapon", - ["command_save"] = "save a player to database", - ["command_saveall"] = "save all players to database", - ["command_setaccountmoney"] = "set account money for a player", - ["command_setaccountmoney_amount"] = "amount of money to set", - ["command_setcoords"] = "teleport to coordinates", - ["command_setcoords_x"] = "x axis", - ["command_setcoords_y"] = "y axis", - ["command_setcoords_z"] = "z axis", - ["command_setjob"] = "set job for a player", - ["command_setjob_job"] = "job name", - ["command_setjob_grade"] = "job grade", - ["command_setjob_invalid"] = "the job, grade or both are invalid", - ["command_setgroup"] = "set player group", - ["command_setgroup_group"] = "group name", - ["commanderror_argumentmismatch"] = "argument count mismatch (passed %s, wanted %s)", - ["commanderror_argumentmismatch_number"] = "argument #%s type mismatch (passed string, wanted number)", - ["commanderror_invaliditem"] = "invalid item name", - ["commanderror_invalidweapon"] = "invalid weapon", - ["commanderror_console"] = "that command can not be run from console", - ["commanderror_invalidcommand"] = "/%s is not an valid command!", - ["commanderror_invalidplayerid"] = "there is no player online matching that server id", - ["commandgeneric_playerid"] = "player id", + ["command_bring"] = "Přivolat si hráče k sobě", + ["command_car"] = "Spawnout vozidlo", + ["command_car_car"] = "Zadej jméno vozidla nebo spawnname", + ["command_cardel"] = "Odstranění vozidla v okolí", + ["command_cardel_radius"] = "Odstranění vozidla v určeném dosahu", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", + ["command_clear"] = "Vymazat text v chatu", + ["command_clearall"] = "Vymazat chet pro všechny hráče", + ["command_clearinventory"] = "Vymazat všechny věci z invetáře hráče", + ["command_clearloadout"] = "Vymazat všechny zbraně z inventáře hráče", + ["command_freeze"] = "Zmrazit hráče", + ["command_unfreeze"] = "Odmrazit hráče", + ["command_giveaccountmoney"] = "Poslat peníze na účet ", + ["command_giveaccountmoney_account"] = "Převést peníze na účet", + ["command_giveaccountmoney_amount"] = "Částka k poslání", + ["command_giveaccountmoney_invalid"] = "Neplátné jméno", + ["command_giveitem"] = "Darovat věc hráči", + ["command_giveitem_item"] = "Název věci", + ["command_giveitem_count"] = "Množství", + ["command_giveweapon"] = "Dát zbraň hráči", + ["command_giveweapon_weapon"] = "Název zbraně", + ["command_giveweapon_ammo"] = "Množství náboje", + ["command_giveweapon_hasalready"] = "Hráč již má tuto zbraň", + ["command_giveweaponcomponent"] = "Darovat přídavek na zbraň", + ["command_giveweaponcomponent_component"] = "Název zbraně", + ["command_giveweaponcomponent_invalid"] = "Špatné jméno přídavku", + ["command_giveweaponcomponent_hasalready"] = "Hráč již má tento přídavek", + ["command_giveweaponcomponent_missingweapon"] = "Hráč nemá tuto zbrań", + ["command_goto"] = "Teleportování sebe k hráči", + ["command_kill"] = "Zabití hráče", + ["command_save"] = "Uložení dat hráče", + ["command_saveall"] = "Uložení veškerých dat hráče", + ["command_setaccountmoney"] = "Nastavení určeného počtu peněz", + ["command_setaccountmoney_amount"] = "Počet peněz", + ["command_setcoords"] = "Teleportování na určené souřadnice", + ["command_setcoords_x"] = "Hodnota X", + ["command_setcoords_y"] = "Hodnota Y", + ["command_setcoords_z"] = "Hodnota Z", + ["command_setjob"] = "Nastavit práci hráči", + ["command_setjob_job"] = "Název práce", + ["command_setjob_grade"] = "Pozice ve firmě", + ["command_setjob_invalid"] = "Špatné zadání práce,hodnosti nebo i obou hodnot", + ["command_setgroup"] = "Nastavení práv hráči", + ["command_setgroup_group"] = "Název skupiny", + ["commanderror_argumentmismatch"] = "Chybný počet hodnot (správně %s, potřebných %s)", + ["commanderror_argumentmismatch_number"] = "Chybně zadaná hodnot #%s (správně, špatně)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Špatný předmět", + ["commanderror_invalidweapon"] = "Špatná zbraň", + ["commanderror_console"] = "příkaz nelze být zpracován v konzoli", + ["commanderror_invalidcommand"] = "Špatný příkaz - /%s", + ["commanderror_invalidplayerid"] = "Hráč není dostupný", + ["commandgeneric_playerid"] = "Id hráče", + ["command_giveammo_noweapon_found"] = "%s nemá tuto zbraň", + ["command_giveammo_weapon"] = "Název zbraně", + ["command_giveammo_ammo"] = "Počet nábojů", -- Locale settings - ["locale_digit_grouping_symbol"] = " ", - ["locale_currency"] = "$%s", + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "£%s", -- Weapons - ["weapon_knife"] = "nuz", - ["weapon_nightstick"] = "policejni obusek", - ["weapon_hammer"] = "kladivo", - ["weapon_bat"] = "basseballka", - ["weapon_golfclub"] = "gollfova hul", - ["weapon_crowbar"] = "pacidlo", - ["weapon_pistol"] = "pistole", - ["weapon_combatpistol"] = "utocna pistole", - ["weapon_appistol"] = "ap pistole", - ["weapon_pistol50"] = "pistole .50", - ["weapon_microsmg"] = "micro smg", - ["weapon_smg"] = "smg", - ["weapon_assaultsmg"] = "utocne smg", - ["weapon_assaultrifle"] = "utocna puska", - ["weapon_carbinerifle"] = "carbine puska", - ["weapon_advancedrifle"] = "pokrocily puska", - ["weapon_mg"] = "mg", - ["weapon_combatmg"] = "utocne mg", - ["weapon_pumpshotgun"] = "pumpovana brokovnice", - ["weapon_sawnoffshotgun"] = "upilovana brokovnice", - ["weapon_assaultshotgun"] = "utocna brokovnice", - ["weapon_bullpupshotgun"] = "bullpup brokovnice", - ["weapon_stungun"] = "tazer", - ["weapon_sniperrifle"] = "sniperka", - ["weapon_heavysniper"] = "tezka sniperka", - ["weapon_grenadelauncher"] = "launcher granatu", - ["weapon_rpg"] = "raketomet", - ["weapon_minigun"] = "minigun", - ["weapon_grenade"] = "granat", - ["weapon_stickybomb"] = "lepkava bomba", - ["weapon_smokegrenade"] = "kourovy granat", - ["weapon_bzgas"] = "bz gas", - ["weapon_molotov"] = "molotov koktejl", - ["weapon_fireextinguisher"] = "hasicak", - ["weapon_petrolcan"] = "kanystr", - ["weapon_ball"] = "koule", - ["weapon_snspistol"] = "sns pistole", - ["weapon_bottle"] = "lahev", - ["weapon_gusenberg"] = "gusenberguv zametac", - ["weapon_specialcarbine"] = "specialni karabina", - ["weapon_heavypistol"] = "tezka pistole", - ["weapon_bullpuprifle"] = "bullpup puska", - ["weapon_dagger"] = "dyka", - ["weapon_vintagepistol"] = "velmi stara pistole", - ["weapon_firework"] = "ohnostroj", - ["weapon_musket"] = "musketa", - ["weapon_heavyshotgun"] = "tezka brokovnice", - ["weapon_marksmanrifle"] = "puska strelce", - ["weapon_hominglauncher"] = "navadeci launcher", - ["weapon_proxmine"] = "mina na blizko", - ["weapon_snowball"] = "snehova koule", - ["weapon_flaregun"] = "svetlice", - ["weapon_combatpdw"] = "utocne pdw", - ["weapon_marksmanpistol"] = "pistole strelce", - ["weapon_knuckle"] = "knuckledusters", - ["weapon_hatchet"] = "sekerka", - ["weapon_railgun"] = "vlakovy launcher", - ["weapon_machete"] = "maceta", - ["weapon_machinepistol"] = "kulomet", - ["weapon_switchblade"] = "vystrelovaci nuz", - ["weapon_revolver"] = "tezky revolver", - ["weapon_dbshotgun"] = "dvouhlavnova brokovnice", - ["weapon_compactrifle"] = "kompaktni puska", - ["weapon_autoshotgun"] = "automaticka brokovnice", - ["weapon_battleaxe"] = "bojova sekera", - ["weapon_compactlauncher"] = "kompaktni launcher", - ["weapon_minismg"] = "mini smg", - ["weapon_pipebomb"] = "dymkova bomba", - ["weapon_poolcue"] = "kulecnikove tago", - ["weapon_wrench"] = "klic na trubky", - ["weapon_flashlight"] = "baterka", - ["gadget_parachute"] = "padak", - ["weapon_flare"] = "svetlice", - ["weapon_doubleaction"] = "dvojhlavnovy revolver", + + -- Melee + ["weapon_dagger"] = "Dýka", + ["weapon_bat"] = "Baseballová pálka", + ["weapon_battleaxe"] = "Bitevní sekera", + ["weapon_bottle"] = "Rozbitá lahve", + ["weapon_crowbar"] = "Páčidlo", + ["weapon_flashlight"] = "Baterka", + ["weapon_golfclub"] = "Golfová hůl", + ["weapon_hammer"] = "Kladivo", + ["weapon_hatchet"] = "Sekera", + ["weapon_knife"] = "Nůž", + ["weapon_knuckle"] = "Boxer", + ["weapon_machete"] = "Mačeta", + ["weapon_nightstick"] = "Policejní obušek", + ["weapon_wrench"] = "Francouzský klíč", + ["weapon_poolcue"] = "Kulečníkové tágo", + ["weapon_stone_hatchet"] = "Kamenná sekera", + ["weapon_switchblade"] = "Vystřelovací nůž", + + -- Handguns + ["weapon_appistol"] = "AP pistol", + ["weapon_ceramicpistol"] = "Ceramic pistol", + ["weapon_combatpistol"] = "Combat pistol", + ["weapon_doubleaction"] = "Double-Action Revolver", + ["weapon_navyrevolver"] = "Navy Revolver", + ["weapon_flaregun"] = "Flaregun", + ["weapon_gadgetpistol"] = "Gadget Pistol", + ["weapon_heavypistol"] = "Heavy Pistol", + ["weapon_revolver"] = "Heavy Revolver", + ["weapon_revolver_mk2"] = "Heavy Revolver MK2", + ["weapon_marksmanpistol"] = "Marksman Pistol", + ["weapon_pistol"] = "Pistol", + ["weapon_pistol_mk2"] = "Pistol MK2", + ["weapon_pistol50"] = "Pistol .50", + ["weapon_snspistol"] = "SNS Pistol", + ["weapon_snspistol_mk2"] = "SNS Pistol MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Vintage Pistol", + + -- Shotguns + ["weapon_assaultshotgun"] = "Assault Shotgun", + ["weapon_autoshotgun"] = "Auto Shotgun", + ["weapon_bullpupshotgun"] = "Bullpup Shotgun", + ["weapon_combatshotgun"] = "Combat Shotgun", + ["weapon_dbshotgun"] = "Double Barrel Shotgun", + ["weapon_heavyshotgun"] = "Heavy Shotgun", + ["weapon_musket"] = "Musket", + ["weapon_pumpshotgun"] = "Pump Shotgun", + ["weapon_pumpshotgun_mk2"] = "Pump Shotgun MK2", + ["weapon_sawnoffshotgun"] = "Sawed Off Shotgun", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Assault SMG", + ["weapon_combatmg"] = "Combat MG", + ["weapon_combatmg_mk2"] = "Combat MG MK2", + ["weapon_combatpdw"] = "Combat PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Machine Pistol", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Unholy Hellbringer", + + -- Rifles + ["weapon_advancedrifle"] = "Advanced Rifle", + ["weapon_assaultrifle"] = "Assault Rifle", + ["weapon_assaultrifle_mk2"] = "Assault Rifle MK2", + ["weapon_bullpuprifle"] = "Bullpup Rifle", + ["weapon_bullpuprifle_mk2"] = "Bullpup Rifle MK2", + ["weapon_carbinerifle"] = "Carbine Rifle", + ["weapon_carbinerifle_mk2"] = "Carbine Rifle MK2", + ["weapon_compactrifle"] = "Compact Rifle", + ["weapon_militaryrifle"] = "Military Rifle", + ["weapon_specialcarbine"] = "Special Carbine", + ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated + + -- Sniper + ["weapon_heavysniper"] = "Heavy Sniper", + ["weapon_heavysniper_mk2"] = "Heavy Sniper MK2", + ["weapon_marksmanrifle"] = "Marksman Rifle", + ["weapon_marksmanrifle_mk2"] = "Marksman Rifle MK2", + ["weapon_sniperrifle"] = "Sniper Rifle", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Compact Launcher", + ["weapon_firework"] = "Firework Launcher", + ["weapon_grenadelauncher"] = "Grenade Launcher", + ["weapon_hominglauncher"] = "Homing Launcher", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Rocket Launcher", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Detektor kovu", + ["weapon_precisionrifle"] = "Precision Rifle", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + + -- Thrown + ["weapon_ball"] = "Míček", + ["weapon_bzgas"] = "Smrtící slzný plyn", + ["weapon_flare"] = "Světlice", + ["weapon_grenade"] = "Granát", + ["weapon_petrolcan"] = "Kanistr", + ["weapon_hazardcan"] = "Hazardous Jerrycan", + ["weapon_molotov"] = "Molotův koktejl", + ["weapon_proxmine"] = "Pohybová mina", + ["weapon_pipebomb"] = "Trubková bomba", + ["weapon_snowball"] = "Sněhová koule", + ["weapon_stickybomb"] = "C4", + ["weapon_smokegrenade"] = "Slzný plyn", + + -- Special + ["weapon_fireextinguisher"] = "Hasící přístroj", + ["weapon_digiscanner"] = "Skener", + ["weapon_garbagebag"] = "Odpadkový pytel", + ["weapon_handcuffs"] = "Pouta", + ["gadget_nightvision"] = "Noční vidění", + ["gadget_parachute"] = "Padák", -- Weapon Components - ["component_clip_default"] = "zakladni rukojet", - ["component_clip_extended"] = "prodloucena rukojet", + ["component_knuckle_base"] = "base Model", + ["component_knuckle_pimp"] = "the Pimp", + ["component_knuckle_ballas"] = "the Ballas", + ["component_knuckle_dollar"] = "the Hustler", + ["component_knuckle_diamond"] = "the Rock", + ["component_knuckle_hate"] = "the Hater", + ["component_knuckle_love"] = "the Lover", + ["component_knuckle_player"] = "the Player", + ["component_knuckle_king"] = "the King", + ["component_knuckle_vagos"] = "the Vagos", + + ["component_luxary_finish"] = "luxary Weapon Finish", + + ["component_handle_default"] = "default Handle", + ["component_handle_vip"] = "vIP Handle", + ["component_handle_bodyguard"] = "bodyguard Handle", + + ["component_vip_finish"] = "vIP Finish", + ["component_bodyguard_finish"] = "bodyguard Finish", + + ["component_camo_finish"] = "digital Camo", + ["component_camo_finish2"] = "brushstroke Camo", + ["component_camo_finish3"] = "woodland Camo", + ["component_camo_finish4"] = "skull Camo", + ["component_camo_finish5"] = "sessanta Nove Camo", + ["component_camo_finish6"] = "perseus Camo", + ["component_camo_finish7"] = "leopard Camo", + ["component_camo_finish8"] = "zebra Camo", + ["component_camo_finish9"] = "geometric Camo", + ["component_camo_finish10"] = "boom Camo", + ["component_camo_finish11"] = "patriotic Camo", + + ["component_camo_slide_finish"] = "digital Slide Camo", + ["component_camo_slide_finish2"] = "brushstroke Slide Camo", + ["component_camo_slide_finish3"] = "woodland Slide Camo", + ["component_camo_slide_finish4"] = "skull Slide Camo", + ["component_camo_slide_finish5"] = "sessanta Nove Slide Camo", + ["component_camo_slide_finish6"] = "perseus Slide Camo", + ["component_camo_slide_finish7"] = "leopard Slide Camo", + ["component_camo_slide_finish8"] = "zebra Slide Camo", + ["component_camo_slide_finish9"] = "geometric Slide Camo", + ["component_camo_slide_finish10"] = "boom Slide Camo", + ["component_camo_slide_finish11"] = "patriotic Slide Camo", + + ["component_clip_default"] = "default Magazine", + ["component_clip_extended"] = "extended Magazine", ["component_clip_drum"] = "drum Magazine", - ["component_clip_box"] = "krabice s naboji", - ["component_flashlight"] = "baterka", - ["component_scope"] = "zamerovac", - ["component_scope_advanced"] = "pokrocily zamerovac", - ["component_suppressor"] = "tlumic", - ["component_grip"] = "rukojet", - ["component_luxary_finish"] = "luxusni vzhled zbrane", + ["component_clip_box"] = "box Magazine", + + ["component_scope_holo"] = "holographic Scope", + ["component_scope_small"] = "small Scope", + ["component_scope_medium"] = "medium Scope", + ["component_scope_large"] = "large Scope", + ["component_scope"] = "mounted Scope", + ["component_scope_advanced"] = "advanced Scope", + ["component_ironsights"] = "ironsights", + + ["component_suppressor"] = "suppressor", + ["component_compensator"] = "compensator", + + ["component_muzzle_flat"] = "flat Muzzle Brake", + ["component_muzzle_tactical"] = "tactical Muzzle Brake", + ["component_muzzle_fat"] = "fat-End Muzzle Brake", + ["component_muzzle_precision"] = "precision Muzzle Brake", + ["component_muzzle_heavy"] = "heavy Duty Muzzle Brake", + ["component_muzzle_slanted"] = "slanted Muzzle Brake", + ["component_muzzle_split"] = "split-End Muzzle Brake", + ["component_muzzle_squared"] = "squared Muzzle Brake", + + ["component_flashlight"] = "flashlight", + ["component_grip"] = "grip", + + ["component_barrel_default"] = "default Barrel", + ["component_barrel_heavy"] = "heavy Barrel", + + ["component_ammo_tracer"] = "tracer Ammo", + ["component_ammo_incendiary"] = "incendiary Ammo", + ["component_ammo_hollowpoint"] = "hollowpoint Ammo", + ["component_ammo_fmj"] = "fMJ Ammo", + ["component_ammo_armor"] = "armor Piercing Ammo", + ["component_ammo_explosive"] = "armor Piercing Incendiary Ammo", + + ["component_shells_default"] = "default Shells", + ["component_shells_incendiary"] = "dragons Breath Shells", + ["component_shells_armor"] = "steel Buckshot Shells", + ["component_shells_hollowpoint"] = "flechette Shells", + ["component_shells_explosive"] = "explosive Slug Shells", -- Weapon Ammo - ["ammo_rounds"] = "naboj(e)", - ["ammo_shells"] = "patrona(y)", - ["ammo_charge"] = "naboj(e)", - ["ammo_petrol"] = "galonu paliva", - ["ammo_firework"] = "ohnostroj(e)", - ["ammo_rockets"] = "raketa(y)", - ["ammo_grenadelauncher"] = "granat(y)", - ["ammo_grenade"] = "granat(y)", - ["ammo_stickybomb"] = "bomba(y)", - ["ammo_pipebomb"] = "bomba(y)", - ["ammo_smokebomb"] = "bomba(y)", - ["ammo_molotov"] = "koktejl(y)", - ["ammo_proxmine"] = "mina(y)", - ["ammo_bzgas"] = "kanystr(y)", - ["ammo_ball"] = "koule", - ["ammo_snowball"] = "snehova(e) koule", - ["ammo_flare"] = "svetlice", - ["ammo_flaregun"] = "svetlice", + ["ammo_rounds"] = "round(s)", + ["ammo_shells"] = "shell(s)", + ["ammo_charge"] = "charge", + ["ammo_petrol"] = "gallons of fuel", + ["ammo_firework"] = "firework(s)", + ["ammo_rockets"] = "rocket(s)", + ["ammo_grenadelauncher"] = "grenade(s)", + ["ammo_grenade"] = "grenade(s)", + ["ammo_stickybomb"] = "bomb(s)", + ["ammo_pipebomb"] = "bomb(s)", + ["ammo_smokebomb"] = "bomb(s)", + ["ammo_molotov"] = "cocktail(s)", + ["ammo_proxmine"] = "mine(s)", + ["ammo_bzgas"] = "can(s)", + ["ammo_ball"] = "ball(s)", + ["ammo_snowball"] = "snowball(s)", + ["ammo_flare"] = "flare(s)", + ["ammo_flaregun"] = "flare(s)", -- Weapon Tints - ["tint_default"] = "zakladni skin", - ["tint_green"] = "zeleny skin", - ["tint_gold"] = "zlaty skin", - ["tint_pink"] = "ruzovy skin", - ["tint_army"] = "armadni skin", - ["tint_lspd"] = "modry skin", - ["tint_orange"] = "oranzovy skin", - ["tint_platinum"] = "platinovy skin", + ["tint_default"] = "default skin", + ["tint_green"] = "green skin", + ["tint_gold"] = "gold skin", + ["tint_pink"] = "pink skin", + ["tint_army"] = "army skin", + ["tint_lspd"] = "blue skin", + ["tint_orange"] = "orange skin", + ["tint_platinum"] = "platinum skin", } diff --git a/server-data/resources/[esx]/es_extended/locales/de.lua b/server-data/resources/[esx]/es_extended/locales/de.lua index 81befedac..11928e737 100644 --- a/server-data/resources/[esx]/es_extended/locales/de.lua +++ b/server-data/resources/[esx]/es_extended/locales/de.lua @@ -1,218 +1,381 @@ Locales["de"] = { -- Inventory - ["giveammo"] = "munition geben", - ["amountammo"] = "anzahl der munition", - ["noammo"] = "du hast keine munition!", - ["gave_item"] = "du gibst %sx %s an %s", - ["received_item"] = "du empfängst %sx %s von %s", - ["gave_weapon"] = "du gibst %s an %s", - ["gave_weapon_ammo"] = "du gibst ~o~%sx %s von %s an %s", - ["gave_weapon_withammo"] = "du gibst %s mit ~o~%sx %s an %s", - ["gave_weapon_hasalready"] = "%s hat bereits eine(n) %s", + ["inventory"] = "Inventar ( Gewicht %s / %s )", + ["use"] = "Benutzen", + ["give"] = "Geben", + ["remove"] = "Entsorgen", + ["return"] = "Zurück", + ["give_to"] = "Geben an", + ["amount"] = "Anzahl", + ["giveammo"] = "Munition geben", + ["amountammo"] = "Munitions Anzahl", + ["noammo"] = "Nicht Genug!", + ["gave_item"] = "Du gibst %sx %s an %s", + ["received_item"] = "Du bekommst %sx %s von %s", + ["gave_weapon"] = "Du gibst %s an %s", + ["gave_weapon_ammo"] = "Du gibst ~o~%sx %s für %s an %s", + ["gave_weapon_withammo"] = "Du gibst %s mit ~o~%sx %s an %s", + ["gave_weapon_hasalready"] = "%s hat bereits %s", ["gave_weapon_noweapon"] = "%s hat diese Waffe nicht", - ["received_weapon"] = "du erhälst %s von %s", - ["received_weapon_ammo"] = "du erhälst ~o~%sx %s für dein %s von %s", - ["received_weapon_withammo"] = "du erhälst %s mit ~o~%sx %s von %s", - ["received_weapon_hasalready"] = "%s hat versucht dir eine(n) %s zu geben, aber du hast bereits eine(n)", - ["received_weapon_noweapon"] = "%s ahat versucht dir Munition für eine(n) %s, aber du besitzt diese Waffe nicht", - ["gave_account_money"] = "du gibst $%s (%s) an %s", - ["received_account_money"] = "du empfängst $%s (%s) von %s", - ["amount_invalid"] = "ungültiger Betrag", - ["players_nearby"] = "keine Spieler in der Nähe", - ["ex_inv_lim"] = "aktion nicht möglich, Inventarlimit überschritten für %s", - ["imp_invalid_quantity"] = "aktion nicht möglich, ungültige Anzahl", - ["imp_invalid_amount"] = "aktion nicht möglich, ungültiger Betrag", - ["threw_standard"] = "du wirfst %sx %s", - ["threw_account"] = "du wirfst $%s %s weg", - ["threw_weapon"] = "du wirfst %s weg", - ["threw_weapon_ammo"] = "du wirfst %s mit ~o~%sx %s weg", - ["threw_weapon_already"] = "Du hast bereits diese Waffe", - ["threw_cannot_pickup"] = "Du kannst das nicht aufheben, da dein Inventar voll ist", - ["threw_pickup_prompt"] = "drücke E um aufzuheben", + ["received_weapon"] = "Du bekommst %s von %s", + ["received_weapon_ammo"] = "Du bekommst ~o~%sx %s für deine %s von %s", + ["received_weapon_withammo"] = "Du bekommst %s mit ~o~%sx %s von %s", + ["received_weapon_hasalready"] = "%s hat versucht dir eine %s zu geben, jedoch hast du diese Waffe bereits!", + ["received_weapon_noweapon"] = "%s hat versucht dir Munition für eine %s zu geben, jedoch hast du diese Waffe bereits!", + ["gave_account_money"] = "Du gibst %s€ (%s) an %s", + ["received_account_money"] = "Du bekommst %s€ (%s) von %s", + ["amount_invalid"] = "Ungültige Anzahl", + ["players_nearby"] = "Keine Personen in der Nähe!", + ["ex_inv_lim"] = "Du kannst diese Aktion nicht ausführen!, Inventarlimit für %s überschritten.", + ["imp_invalid_quantity"] = "Du kannst diese Aktion nicht ausführen!, Ungültige Anzahl!", + ["imp_invalid_amount"] = "Du kannst diese Aktion nicht ausführen!, Ungültige Anzahl", + ["threw_standard"] = "Du entsorgst %sx %s", + ["threw_account"] = "Du Entsorgst %s€ %s", + ["threw_weapon"] = "Du entsorgst %s", + ["threw_weapon_ammo"] = "Du entsorgst %s mit ~o~%sx %s", + ["threw_weapon_already"] = "Du hast diese Waffe bereits!", + ["threw_cannot_pickup"] = "Inventar ist voll! Du kannst dies nicht aufheben", + ["threw_pickup_prompt"] = "Drücke [E] zum aufheben", -- Key mapping - ["keymap_showinventory"] = "inventar anzeigen", + ["keymap_showinventory"] = "Inventar Anzeigen", -- Salary related - ["received_salary"] = "du hast dein Gehalt erhalten: $%s", - ["received_help"] = "du hast deine Sozialhilfe erhalten: $%s", - ["company_nomoney"] = "die Firma in der du angestellt bist, ist zu arm um dein Gehalt zu zahlen", - ["received_paycheck"] = "erhaltener Gehaltsscheck", - ["bank"] = "bank", - ["account_bank"] = "bank", - ["account_black_money"] = "dirty Money", - ["account_money"] = "cash", - - ["act_imp"] = "Aktion nicht möglich", - ["in_vehicle"] = "du kannst keine Items in einem Fahrzeug weitergeben", + ["received_salary"] = "Dein Gehaltscheck ist angekommen!: %s€", + ["received_help"] = "Deine Sozialhilfe ist angekommen: %s€", + ["company_nomoney"] = "Die Firma an der du Angestellt bist, ist leider Arm und kann dich nicht bezahlen :(", + ["received_paycheck"] = "Gehaltscheck erhalten", + ["bank"] = "Maze Bank", + ["account_bank"] = "Bank", + ["account_black_money"] = "Schwarzgeld", + ["account_money"] = "Bargeld", + + ["act_imp"] = "Du kannst diese Aktion nicht ausführen!", + ["in_vehicle"] = "Person darf nicht in einem Fahrzeug sein!", + ["not_in_vehicle"] = "Person muss in einem Fahrzeug sein!", -- Commands - ["command_car"] = "fahrzeug spawnen", - ["command_car_car"] = "vehicle spawn name or hash", - ["command_cardel"] = "fahrzeuge in der nähe löschen", - ["command_cardel_radius"] = "optional, jedes fahrzeug innerhalb des angegebenen radius löschens", - ["command_clear"] = "chat leeren", - ["command_clearall"] = "chat leeren für alle spieler", - ["command_clearinventory"] = "spieler inventar leeren", - ["command_clearloadout"] = "spieler ausstattung löschen", - ["command_giveaccountmoney"] = "gebe guthaben", - ["command_giveaccountmoney_account"] = "gültiger account name", - ["command_giveaccountmoney_amount"] = "anzahl zum hinzufügen", - ["command_giveaccountmoney_invalid"] = "ungültiger account name", - ["command_giveitem"] = "gebe ein item zu einem spieler", - ["command_giveitem_item"] = "item name", - ["command_giveitem_count"] = "item anzahl", - ["command_giveweapon"] = "gebe waffe zu einem spieler", - ["command_giveweapon_weapon"] = "waffen name", - ["command_giveweapon_ammo"] = "munition anzahl", - ["command_giveweapon_hasalready"] = "spieler hat bereits diese waffe", - ["command_giveweaponcomponent"] = "gebe waffen component", - ["command_giveweaponcomponent_component"] = "component name", - ["command_giveweaponcomponent_invalid"] = "ungültiges waffen component", - ["command_giveweaponcomponent_hasalready"] = "spieler hat bereits dieses waffen komponent", - ["command_giveweaponcomponent_missingweapon"] = "spieler hat diese waffe nicht", - ["command_save"] = "spieler in die datenbank sichern", - ["command_saveall"] = "alle spieler in die datenbank sichern", - ["command_setaccountmoney"] = "guthaben für den spieler setzen", - ["command_setaccountmoney_amount"] = "guthaben zum setzen", - ["command_setcoords"] = "teleportieren zu koordinaten", - ["command_setcoords_x"] = "x axis", - ["command_setcoords_y"] = "y axis", - ["command_setcoords_z"] = "z axis", - ["command_setjob"] = "job für einen spieler setzen", - ["command_setjob_job"] = "job name", - ["command_setjob_grade"] = "job grade", - ["command_setjob_invalid"] = "der job, grade oder beides ist ungültig", - ["command_setgroup"] = "setze spieler gruppe", - ["command_setgroup_group"] = "gruppen name", - ["commanderror_argumentmismatch"] = "argumentanzahl stimmt nicht überein (übergeben %s, gesucht %s)", - ["commanderror_argumentmismatch_number"] = "argument #%s typ stimmt nicht überein (übergeben string, gewünscht zahl)", - ["commanderror_invaliditem"] = "falscher item name", - ["commanderror_invalidweapon"] = "ungültige waffe", - ["commanderror_console"] = "der command kann nicht von der konsole ausgeführt werden", - ["commanderror_invalidcommand"] = "/%s ist kein verfügbarer command!", - ["commanderror_invalidplayerid"] = "kein spieler online mit dieser id", - ["commandgeneric_playerid"] = "spieler id", + ["command_bring"] = "Person zu dir bringen", + ["command_car"] = "Fahrzeug Spawnen", + ["command_car_car"] = "Fahrzeug Model oder Hash", + ["command_cardel"] = "Fahrzeuge entfernen", + ["command_cardel_radius"] = "Entfernt alle Fahrzeuge in einem bestimmten Radius", + ["command_repair"] = "Fahrzeug reparieren", + ["command_repair_success"] = "Fahrzeug erfolgreich repariert.", + ["command_repair_success_target"] = "Ein Admin hat dein Fahrzeug repariert.", + ["command_clear"] = "Textchat leeren", + ["command_clearall"] = "Textchat für alle Spieler leeren", + ["command_clearinventory"] = "Alle Gegenstände vom Inventar eines Spielers entfernen", + ["command_clearloadout"] = "Alle Waffen vom Loadout eines Spielers entfernen", + ["command_freeze"] = "Spieler Freezen", + ["command_unfreeze"] = "Spieler Entfreezen", + ["command_giveaccountmoney"] = "Geld an ein bestimmtes Konto geben", + ["command_giveaccountmoney_account"] = "Konto, wohin das Geld hinzugefügt werden soll", + ["command_giveaccountmoney_amount"] = "Menge zum Hinzufügen", + ["command_giveaccountmoney_invalid"] = "Accountname ungültig!", + ["command_giveitem"] = "Spieler ein Gegenstand geben", + ["command_giveitem_item"] = "Gegenstand Name", + ["command_giveitem_count"] = "Menge", + ["command_giveweapon"] = "Spieler eine Waffe geben", + ["command_giveweapon_weapon"] = "Waffenname", + ["command_giveweapon_ammo"] = "Munitionsanzahl", + ["command_giveweapon_hasalready"] = "Spieler hat diese Waffe bereits!", + ["command_giveweaponcomponent"] = "Waffenkomponent an einen Spieler geben", + ["command_giveweaponcomponent_component"] = "Komponentenname", + ["command_giveweaponcomponent_invalid"] = "Ungültiger Komponentenname", + ["command_giveweaponcomponent_hasalready"] = "Spieler hat diese Komponente bereits!", + ["command_giveweaponcomponent_missingweapon"] = "Spieler hat diese Waffe nicht!", + ["command_goto"] = "Teleportiere dich zu einem Spieler", + ["command_kill"] = "Spieler Töten", + ["command_save"] = "Von einem bestimmten Spieler die Spielerdaten speichern", + ["command_saveall"] = "Von allen Spielern die Spielerdaten speichern", + ["command_setaccountmoney"] = "Geld auf einem bestimmten Konto festlegen", + ["command_setaccountmoney_amount"] = "Menge", + ["command_setcoords"] = "Zu den bestimmten Koordinaten teleportieren", + ["command_setcoords_x"] = "X Koordinate", + ["command_setcoords_y"] = "Y Koordinate", + ["command_setcoords_z"] = "Z Koordinate", + ["command_setjob"] = "Job eines Spielers setzen", + ["command_setjob_job"] = "Name", + ["command_setjob_grade"] = "Job Rang", + ["command_setjob_invalid"] = "Der Rang oder der Name und Rang sind ungültig", + ["command_setgroup"] = "Setzt eine Berechtigungs Gruppe für einen Benutzer", + ["command_setgroup_group"] = "Name der Gruppe", + ["command_removeaccountmoney"] = "Entfernt Geld von einem bestimmten Konto", + ["command_removeaccountmoney_account"] = "Konto von dem es entfernt werden soll", + ["command_removeaccountmoney_amount"] = "Menge, die entfernt werden soll", + ["command_removeaccountmoney_invalid"] = "Name des Kontos ungültig", + ["commanderror_argumentmismatch"] = "Ungültiges Argument (gegeben %s, gewollt %s)", + ["commanderror_argumentmismatch_number"] = "Ungültiges Argument #%s Datentyp (String gegeben, Nummer gefordert)", + ["commanderror_argumentmismatch_string"] = "Ungültiges Argument #%s Datentyp (Nummer gegeben, String gefordert)", + ["commanderror_invaliditem"] = "Ungültiger Gegenstand", + ["commanderror_invalidweapon"] = "Ungültige Waffe", + ["commanderror_console"] = "Befehl kann nicht von der Konsole aus ausgeführt werden!", + ["commanderror_invalidcommand"] = "Ungültiger Befehl - /%s", + ["commanderror_invalidplayerid"] = "Angegebener Spieler ist nicht online!", + ["commandgeneric_playerid"] = "Spieler ID", + ["command_giveammo_noweapon_found"] = "%s besitzt diese Waffe nicht!", + ["command_giveammo_weapon"] = "Waffenname", + ["command_giveammo_ammo"] = "Munitionsanzahl", + ["tpm_nowaypoint"] = "Kein Wegpunkt gesetzt!", + ["tpm_success"] = "Erfolgreich teleportiert.", + + ["noclip_message"] = "Noclip wurde %s", + ["enabled"] = "~g~Aktiviert~s~", + ["disabled"] = "~r~Deaktiviert~s~", -- Locale settings - ["locale_digit_grouping_symbol"] = " ", - ["locale_currency"] = "$%s", + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "%s€", -- Weapons + + -- Melee + ["weapon_dagger"] = "Dolch", + ["weapon_bat"] = "Baseballschläger", + ["weapon_battleaxe"] = "Kampfaxt", + ["weapon_bottle"] = "Flasche", + ["weapon_crowbar"] = "Brechstange", + ["weapon_flashlight"] = "Taschenlampe", + ["weapon_golfclub"] = "Golfschläger", + ["weapon_hammer"] = "Hammer", + ["weapon_hatchet"] = "Beil", ["weapon_knife"] = "Messer", + ["weapon_knuckle"] = "Schlagring", + ["weapon_machete"] = "Machete", ["weapon_nightstick"] = "Schlagstock", - ["weapon_hammer"] = "Hammer", - ["weapon_bat"] = "Schläger", - ["weapon_golfclub"] = "Golfschläger", - ["weapon_crowbar"] = "Brecheisen", - ["weapon_pistol"] = "Pistole", - ["weapon_combatpistol"] = "Kampfpistole", + ["weapon_wrench"] = "Rohrzange", + ["weapon_poolcue"] = "Billiardstange", + ["weapon_stone_hatchet"] = "Steinbeil", + ["weapon_switchblade"] = "Springmesser", + + -- Handguns ["weapon_appistol"] = "AP Pistole", - ["weapon_pistol50"] = "Pistole .50", + ["weapon_ceramicpistol"] = "Keramikpistole", + ["weapon_combatpistol"] = "Kampfpistole", + ["weapon_doubleaction"] = "Double-Action Revolver", + ["weapon_navyrevolver"] = "Navy Revolver", + ["weapon_flaregun"] = "Flaregun", + ["weapon_gadgetpistol"] = "Gadgetpistole", + ["weapon_heavypistol"] = "Schwere Pistole", + ["weapon_revolver"] = "Schwerer Revolver", + ["weapon_revolver_mk2"] = "Schwerer Revolver MK2", + ["weapon_marksmanpistol"] = "Scharfschützen Pistole", + ["weapon_pistol"] = "Pistole", + ["weapon_pistol_mk2"] = "Pistole MK2", + ["weapon_pistol50"] = "Pistole 50 Kaliber", + ["weapon_snspistol"] = "SNS Pistol", + ["weapon_snspistol_mk2"] = "SNS Pistol MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Vintagepistole", + + -- Shotguns + ["weapon_assaultshotgun"] = "Sturmschrotflinte", + ["weapon_autoshotgun"] = "Automatische Schrotflinte", + ["weapon_bullpupshotgun"] = "Bullpup-Schrotflinte", + ["weapon_combatshotgun"] = "Kampfschrotfline", + ["weapon_dbshotgun"] = "Doppelbarrel Schrotflinte", + ["weapon_heavyshotgun"] = "Schwere Schrotflinte", + ["weapon_musket"] = "Muskete", + ["weapon_pumpshotgun"] = "Pump Schrotflinte", + ["weapon_pumpshotgun_mk2"] = "Pump Schrotflinte MK2", + ["weapon_sawnoffshotgun"] = "Abgesägte Schrotflinte", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Sturm SMG", + ["weapon_combatmg"] = "Kampf MG", + ["weapon_combatmg_mk2"] = "Kampf MG MK2", + ["weapon_combatpdw"] = "Kampf PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Maschinenpistole", + ["weapon_mg"] = "MG", ["weapon_microsmg"] = "Mikro SMG", + ["weapon_minismg"] = "Mini SMG", ["weapon_smg"] = "SMG", - ["weapon_assaultsmg"] = "Kampf SMG", - ["weapon_assaultrifle"] = "Kampfgewehr", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Unheiliger Höllenbringer", + + -- Rifles + ["weapon_advancedrifle"] = "Fortgeschrittenes Gewehr", + ["weapon_assaultrifle"] = "Sturmgewehr", + ["weapon_assaultrifle_mk2"] = "Sturmgewehr MK2", + ["weapon_bullpuprifle"] = "Bullpup Gewehr", + ["weapon_bullpuprifle_mk2"] = "Bullpup Gewehr MK2", ["weapon_carbinerifle"] = "Karabinergewehr", - ["weapon_advancedrifle"] = "Advancedgewehr", - ["weapon_mg"] = "MG", - ["weapon_combatmg"] = "Kampf MG", - ["weapon_pumpshotgun"] = "Pumpgun", - ["weapon_sawnoffshotgun"] = "Abgesägte Schrotflinte", - ["weapon_assaultshotgun"] = "Kampf Schrotflinte", - ["weapon_bullpupshotgun"] = "Bullpup Schrotflinte", - ["weapon_stungun"] = "Tazer", - ["weapon_sniperrifle"] = "Scharfschützengewehr", - ["weapon_heavysniper"] = "Schweres Sniper", + ["weapon_carbinerifle_mk2"] = "Karabinergewehr MK2", + ["weapon_compactrifle"] = "Kompaktesgewehr", + ["weapon_militaryrifle"] = "Militärgewehr", + ["weapon_specialcarbine"] = "Spezialkarabiner", + ["weapon_specialcarbine_mk2"] = "Spezialkarabiner MK2", + ["weapon_heavyrifle"] = "Schweres Gewehr", + + -- Sniper + ["weapon_heavysniper"] = "Schwere Sniper", + ["weapon_heavysniper_mk2"] = "Schwere Sniper MK2", + ["weapon_marksmanrifle"] = "Scharfschützengewehr", + ["weapon_marksmanrifle_mk2"] = "Scharfschützengewehr MK2", + ["weapon_sniperrifle"] = "Sniper", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Kompaktlauncher", + ["weapon_firework"] = "Feuerwerklauncher", ["weapon_grenadelauncher"] = "Granatwerfer", - ["weapon_rpg"] = "RPG", + ["weapon_hominglauncher"] = "Lenkraketenwerfer", ["weapon_minigun"] = "Minigun", - ["weapon_grenade"] = "Granate", - ["weapon_stickybomb"] = "Haftbombe", - ["weapon_smokegrenade"] = "Rauchgranate", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Raketenwerfer", + ["weapon_rayminigun"] = "Witwenmacher", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metalldetektor", + ["weapon_precisionrifle"] = "Präzisionsgewehr", + ["weapon_tactilerifle"] = "Service Karabiner", + + -- Drug Wars DLC + ["weapon_candycane"] = "Zuckerstange", + ["weapon_acidpackage"] = "Säure Paket", + ["weapon_pistolxm3"] = "WM 29 Pistole", + ["weapon_railgunxm3"] = "Railgun", + + -- Thrown + ["weapon_ball"] = "Baseball", ["weapon_bzgas"] = "BZ Gas", - ["weapon_molotov"] = "Molotov Cocktail", - ["weapon_fireextinguisher"] = "Feuerlöscher", + ["weapon_flare"] = "Leuchtfackel", + ["weapon_grenade"] = "Granate", ["weapon_petrolcan"] = "Benzinkanister", - ["weapon_ball"] = "Ball", - ["weapon_snspistol"] = "SNS Pistole", - ["weapon_bottle"] = "Flasche", - ["weapon_gusenberg"] = "Gusenberg", - ["weapon_specialcarbine"] = "Spezialkarabiner", - ["weapon_heavypistol"] = "Schwere Pistole", - ["weapon_bullpuprifle"] = "Bullpupgewehr", - ["weapon_dagger"] = "Dolch", - ["weapon_vintagepistol"] = "Vintage Pistole", - ["weapon_firework"] = "Feuerwerk", - ["weapon_musket"] = "Muskete", - ["weapon_heavyshotgun"] = "Schwere Schrotflinte", - ["weapon_marksmanrifle"] = "Marksmangewehr", - ["weapon_hominglauncher"] = "Homing Launcher", - ["weapon_proxmine"] = "Annäherungsmine", - ["weapon_snowball"] = "Schneeball", - ["weapon_flaregun"] = "Leuchtpistole", - ["weapon_combatpdw"] = "Kampf PDW", - ["weapon_marksmanpistol"] = "Marksman Pistole", - ["weapon_knuckle"] = "Schlagring", - ["weapon_hatchet"] = "Axt", - ["weapon_railgun"] = "Railgun", - ["weapon_machete"] = "Machete", - ["weapon_machinepistol"] = "Maschinenpistole", - ["weapon_switchblade"] = "Klappmesser", - ["weapon_revolver"] = "Schwerer Revolver", - ["weapon_dbshotgun"] = "Doppelläufige Schrotflinte", - ["weapon_compactrifle"] = "Kampfgewehr", - ["weapon_autoshotgun"] = "Auto Schrotflinte", - ["weapon_battleaxe"] = "Kampfaxt", - ["weapon_compactlauncher"] = "Kompakt Granatwerfer", - ["weapon_minismg"] = "Mini SMG", + ["weapon_hazardcan"] = "Gefährliche Kanister", + ["weapon_molotov"] = "Molotov Cocktail", + ["weapon_proxmine"] = "Annährungsmine", ["weapon_pipebomb"] = "Rohrbombe", - ["weapon_poolcue"] = "Billiard-Kö", - ["weapon_wrench"] = "Rohrzange", - ["weapon_flashlight"] = "Taschenlampe", + ["weapon_snowball"] = "Schneeball", + ["weapon_stickybomb"] = "Haftbombe", + ["weapon_smokegrenade"] = "Tränengas", + + -- Special + ["weapon_fireextinguisher"] = "Feuerlöscher", + ["weapon_digiscanner"] = "Digitalscanner", + ["weapon_garbagebag"] = "Müllsack", + ["weapon_handcuffs"] = "Handschelle", + ["gadget_nightvision"] = "Nachtsicht", ["gadget_parachute"] = "Fallschirm", - ["weapon_flare"] = "Leuchtpistole", - ["weapon_doubleaction"] = "double-Action Revolver", -- Weapon Components - ["component_clip_default"] = "standart Griff", - ["component_clip_extended"] = "erweiterter Griff", - ["component_clip_drum"] = "trommelmagazin", - ["component_clip_box"] = "kastenmagazin", - ["component_flashlight"] = "taschenlampe", - ["component_scope"] = "zielfernrohr", - ["component_scope_advanced"] = "erweitertes Zielfernrohr", - ["component_suppressor"] = "schalldämpfer", - ["component_grip"] = "griff", - ["component_luxary_finish"] = "luxus Waffen Design", + ["component_knuckle_base"] = "Basismodell", + ["component_knuckle_pimp"] = "Der Pimp", + ["component_knuckle_ballas"] = "Die Ballas", + ["component_knuckle_dollar"] = "Der Hustler", + ["component_knuckle_diamond"] = "Der Stein", + ["component_knuckle_hate"] = "Der Hater", + ["component_knuckle_love"] = "Der Lover", + ["component_knuckle_player"] = "Der Player", + ["component_knuckle_king"] = "Der King", + ["component_knuckle_vagos"] = "Die Vagos", + + ["component_luxary_finish"] = "Luxuswaffenlackierung", + + ["component_handle_default"] = "Normaler Handgriff", + ["component_handle_vip"] = "VIP Handgriff", + ["component_handle_bodyguard"] = "Bodyguard Handgriff", + + ["component_vip_finish"] = "VIP Lackierung", + ["component_bodyguard_finish"] = "Bodyguard Lackierung", + + ["component_camo_finish"] = "Digitales Camouflage", + ["component_camo_finish2"] = "Pinselstrich Camouflage", + ["component_camo_finish3"] = "Holzland Camouflage", + ["component_camo_finish4"] = "Kopf Camouflage", + ["component_camo_finish5"] = "Sessebta-Nove Camouflage", + ["component_camo_finish6"] = "Perseus Camouflage", + ["component_camo_finish7"] = "Leopard Camouflage", + ["component_camo_finish8"] = "Zebra Camouflage", + ["component_camo_finish9"] = "Geometrisch Camouflage", + ["component_camo_finish10"] = "BOOM Camouflage", + ["component_camo_finish11"] = "Patriotisch Camouflage", + + ["component_camo_slide_finish"] = "Digital Rutschen Camouflage", + ["component_camo_slide_finish2"] = "Pinselstrich Rutschen Camouflage", + ["component_camo_slide_finish3"] = "Holzland Rutschen Camouflage", + ["component_camo_slide_finish4"] = "Kopf Rutschen Camouflage", + ["component_camo_slide_finish5"] = "Sessebta-Nove Nove Rutschen Camouflage", + ["component_camo_slide_finish6"] = "Perseus Rutschen Camouflage", + ["component_camo_slide_finish7"] = "Leopard Rutschen Camouflage", + ["component_camo_slide_finish8"] = "Zebra Rutschen Camouflage", + ["component_camo_slide_finish9"] = "Geometrisch Rutschen Camouflage", + ["component_camo_slide_finish10"] = "BOOM Rutschen Camouflage", + ["component_camo_slide_finish11"] = "Patriotisch Rutschen Camouflage", + + ["component_clip_default"] = "Standart Magazin", + ["component_clip_extended"] = "Erweiterters Magazin", + ["component_clip_drum"] = "Trommelmagazin", + ["component_clip_box"] = "Kastenmagazin", + + ["component_scope_holo"] = "Holographisches Zielfernrohr", + ["component_scope_small"] = "Kleines Zielfernrohr", + ["component_scope_medium"] = "Mittleres Zielfernrohr", + ["component_scope_large"] = "Großes Zielfernrohr", + ["component_scope"] = "Montiertes Zielfernrohr", + ["component_scope_advanced"] = "Fortgeschrittenes Zielfernrohr", + ["component_ironsights"] = "Ironsights", + + ["component_suppressor"] = "Entstörer", + ["component_compensator"] = "Kompensator", + + ["component_muzzle_flat"] = "Flache Mündung", + ["component_muzzle_tactical"] = "Taktische Mündung", + ["component_muzzle_fat"] = "Fettes-Ende Mündung", + ["component_muzzle_precision"] = "Präzision Mündung", + ["component_muzzle_heavy"] = "Schwere Mündung", + ["component_muzzle_slanted"] = "Schräge Mündung", + ["component_muzzle_split"] = "Geteiletes-Ende Mündung", + ["component_muzzle_squared"] = "Quadratische Mündung", + + ["component_flashlight"] = "Taschenlampe", + ["component_grip"] = "Grip", + + ["component_barrel_default"] = "Normales Fass", + ["component_barrel_heavy"] = "Schweres Fass", + + ["component_ammo_tracer"] = "Tracer Munition", + ["component_ammo_incendiary"] = "Aufruhr Munition", + ["component_ammo_hollowpoint"] = "Hohlspitze Munition", + ["component_ammo_fmj"] = "FMJ Munition", + ["component_ammo_armor"] = "Panzerbrechende Munition", + ["component_ammo_explosive"] = "Panzerbrechende brennende Munition", + + ["component_shells_default"] = "Normale Hülsen", + ["component_shells_incendiary"] = "Drachenatem Hülsen", + ["component_shells_armor"] = "Stahlschrot Hülsen", + ["component_shells_hollowpoint"] = "Flechette Hülsen", + ["component_shells_explosive"] = "Explosives Geschoss Hülsen", -- Weapon Ammo - ["ammo_rounds"] = "kugel(n)", - ["ammo_shells"] = "schrotpatrone(n)", - ["ammo_charge"] = "ladung", - ["ammo_petrol"] = "liter Benzin", - ["ammo_firework"] = "feuerwerksrakete(n)", - ["ammo_rockets"] = "rakete(n)", - ["ammo_grenadelauncher"] = "granate(n)", - ["ammo_grenade"] = "granate(n)", - ["ammo_stickybomb"] = "bombe(n)", - ["ammo_pipebomb"] = "bombe(n)", - ["ammo_smokebomb"] = "bombe(n)", - ["ammo_molotov"] = "cocktail(s)", - ["ammo_proxmine"] = "mine(n)", - ["ammo_bzgas"] = "can(n)", - ["ammo_ball"] = "ball", - ["ammo_snowball"] = "schneebälle", - ["ammo_flare"] = "signalfackel(n)", - ["ammo_flaregun"] = "signalfackeln(munition)", + ["ammo_rounds"] = "Kugel(n)", + ["ammo_shells"] = "Schrotpatrone(n)", + ["ammo_charge"] = "Nachladen", + ["ammo_petrol"] = "Benzinkanister", + ["ammo_firework"] = "Feuerwerksrakete(n)", + ["ammo_rockets"] = "Rakete(n)", + ["ammo_grenadelauncher"] = "Granate(n)", + ["ammo_grenade"] = "Granate(n)", + ["ammo_stickybomb"] = "C4(s)", + ["ammo_pipebomb"] = "Rohrbombe(n)", + ["ammo_smokebomb"] = "Rauchgranate(n)", + ["ammo_molotov"] = "Molotovcocktail(s)", + ["ammo_proxmine"] = "Annäherungsmine(n)", + ["ammo_bzgas"] = "Bzgas", + ["ammo_ball"] = "Ball", + ["ammo_snowball"] = "Schneebälle", + ["ammo_flare"] = "Signalfackel(n)", + ["ammo_flaregun"] = "Signalfackeln(munition)", -- Weapon Tints - ["tint_default"] = "standard", - ["tint_green"] = "grün", - ["tint_gold"] = "gold", - ["tint_pink"] = "pink", - ["tint_army"] = "camouflage", - ["tint_lspd"] = "blau", - ["tint_orange"] = "orange", - ["tint_platinum"] = "platin", + ["tint_default"] = "Standard", + ["tint_green"] = "Grün", + ["tint_gold"] = "Gold", + ["tint_pink"] = "Pink", + ["tint_army"] = "Camouflage", + ["tint_lspd"] = "Blau", + ["tint_orange"] = "Orange", + ["tint_platinum"] = "Platin", } diff --git a/server-data/resources/[esx]/es_extended/locales/el.lua b/server-data/resources/[esx]/es_extended/locales/el.lua new file mode 100644 index 000000000..798b17c85 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/el.lua @@ -0,0 +1,381 @@ +Locales["el"] = { + -- Inventory + ["inventory"] = "Αποθήκη ( Βάρος %s / %s )", + ["use"] = "Χρήση", + ["give"] = "Δώσε", + ["remove"] = "Πέτα", + ["return"] = "Επιστροφή", + ["give_to"] = "Δώσε σε", + ["amount"] = "Ποσότητα", + ["giveammo"] = "Δώσε σφαίρες", + ["amountammo"] = "Ποσότητα σφαιρών", + ["noammo"] = "Δεν υπάρχουν αρκετές σφαίρες!", + ["gave_item"] = "Δώσατε %sx %s στον/στην %s", + ["received_item"] = "Λάβατε %sx %s από τον/την %s", + ["gave_weapon"] = "Δίνετε %s στον/στην %s", + ["gave_weapon_ammo"] = "Δίνετε ~o~%sx %s για %s στον/στην %s", + ["gave_weapon_withammo"] = "Δίνετε %s με ~o~%sx %s στον/στην %s", + ["gave_weapon_hasalready"] = "Ο/Η %s έχει ήδη ένα %s", + ["gave_weapon_noweapon"] = "Ο/Η %s δεν έχει αυτό το όπλο", + ["received_weapon"] = "Λάβατε %s από τον/την %s", + ["received_weapon_ammo"] = "Λάβατε ~o~%sx %s για το %s από τον/την %s", + ["received_weapon_withammo"] = "Λάβατε %s για ~o~%sx %s από τον/την %s", + ["received_weapon_hasalready"] = "Ο/Η %s προσπάθησε να σας δώσει ένα %s, αλλά το έχετε ήδη", + ["received_weapon_noweapon"] = "Ο/Η %s προσπάθησε να σας δώσει σφαίρες για το %s, αλλά δεν έχετε αυτό το όπλο", + ["gave_account_money"] = "Δίνετε $%s (%s) στον/στην %s", + ["received_account_money"] = "Λάβατε $%s (%s) από τον/την %s", + ["amount_invalid"] = "Μη έγκυρη ποσότητα", + ["players_nearby"] = "Δεν υπάρχουν κοντινοί παίκτες", + ["ex_inv_lim"] = "Δεν είναι δυνατή η ενέργεια, υπέρβαση του μέγιστου βάρους των %s", + ["imp_invalid_quantity"] = "Δεν είναι δυνατή η ενέργεια, η ποσότητα δεν είναι έγκυρη", + ["imp_invalid_amount"] = "Δεν είναι δυνατή η ενέργεια, το ποσό δεν είναι έγκυρο", + ["threw_standard"] = "Ρίχνοντας %sx %s", + ["threw_account"] = "Ρίχνοντας $%s %s", + ["threw_weapon"] = "Ρίχνοντας %s", + ["threw_weapon_ammo"] = "Ρίχνοντας %s με ~o~%sx %s", + ["threw_weapon_already"] = "Ήδη έχετε αυτό το όπλο", + ["threw_cannot_pickup"] = "Η αποθήκη είναι γεμάτη, δεν μπορείτε να σηκώσετε!", + ["threw_pickup_prompt"] = "Πατήστε E για να σηκώσετε", + + -- Key mapping + ["keymap_showinventory"] = "Εμφάνιση Αποθήκης", + + -- Salary related + ["received_salary"] = "Έχετε λάβει μισθό: $%s", + ["received_help"] = "Έχετε λάβει το βοήθημά σας: $%s", + ["company_nomoney"] = "Η εταιρεία στην οποία είστε απασχολούμενος/η δεν έχει αρκετά χρήματα για να καταβάλει τον μισθό σας", + ["received_paycheck"] = "λάβατε μισθό", + ["bank"] = "Τράπεζα Maze", + ["account_bank"] = "Τραπεζικός Λογαριασμός", + ["account_black_money"] = "Βρώμικα Χρήματα", + ["account_money"] = "Μετρητά", + + ["act_imp"] = "Δεν είναι δυνατή η εκτέλεση της ενέργειας", + ["in_vehicle"] = "Δεν είναι δυνατή η εκτέλεση της ενέργειας, ο παίκτης βρίσκεται σε όχημα", + ["not_in_vehicle"] = "Δεν είναι δυνατή η εκτέλεση της ενέργειας, ο παίκτης δεν βρίσκεται σε κάποιο όχημα", + + -- Commands + ["command_bring"] = "Φέρτε τον παίκτη σε εσάς", + ["command_car"] = "Κλήση οχήματος", + ["command_car_car"] = "Μοντέλο ή κωδικός οχήματος", + ["command_cardel"] = "Κατάργηση οχημάτων κοντά", + ["command_cardel_radius"] = "Καταργεί όλα τα οχήματα εντός της καθορισμένης ακτίνας", + ["command_repair"] = "Επισκέυασε το όχημα σου", + ["command_repair_success"] = "Το όχημα σου επισκευάστηκε", + ["command_repair_success_target"] = "Ένας διαχειριστής επισκεύασε το όχημα σου", + ["command_clear"] = "Καθαρισμός κειμένου στο chat", + ["command_clearall"] = "Καθαρισμός κειμένου στο chat για όλους τους παίκτες", + ["command_clearinventory"] = "Κατάργηση όλων των αντικειμένων από την αποθήκη των παικτών", + ["command_clearloadout"] = "Κατάργηση όλων των όπλων από την εξάρτηση των παικτών", + ["command_freeze"] = "Πάγωμα ενός παίκτη", + ["command_unfreeze"] = "Ξεπάγωμα ενός παίκτη", + ["command_giveaccountmoney"] = "Δώστε χρήματα σε καθορισμένο λογαριασμό", + ["command_giveaccountmoney_account"] = "Λογαριασμός προς προσθήκη", + ["command_giveaccountmoney_amount"] = "Ποσό προς προσθήκη", + ["command_giveaccountmoney_invalid"] = "Μη έγκυρο όνομα λογαριασμού", + ["command_removeaccountmoney"] = "Κατάργηση χρημάτων από καθορισμένο λογαριασμό", + ["command_removeaccountmoney_account"] = "Λογαριασμός από τον οποίο θα καταργηθούν τα χρήματα", + ["command_removeaccountmoney_amount"] = "Ποσό προς αφαίρεση", + ["command_removeaccountmoney_invalid"] = "Μη έγκυρο όνομα λογαριασμού", + ["command_giveitem"] = "Δώστε σε έναν παίκτη ένα αντικείμενο", + ["command_giveitem_item"] = "Όνομα αντικειμένου", + ["command_giveitem_count"] = "Ποσότητα", + ["command_giveweapon"] = "Δώστε σε έναν παίκτη ένα όπλο", + ["command_giveweapon_weapon"] = "Όνομα όπλου", + ["command_giveweapon_ammo"] = "Ποσότητα πυρομαχικών", + ["command_giveweapon_hasalready"] = "Ο παίκτης έχει ήδη αυτό το όπλο", + ["command_giveweaponcomponent"] = "Δώστε σε έναν παίκτη μια εξάρτηση όπλου", + ["command_giveweaponcomponent_component"] = "Όνομα εξάρτησης", + ["command_giveweaponcomponent_invalid"] = "Μη έγκυρη εξάρτηση όπλου", + ["command_giveweaponcomponent_hasalready"] = "Ο παίκτης έχει ήδη αυτήν την εξάρτηση όπλου", + ["command_giveweaponcomponent_missingweapon"] = "Ο παίκτης δεν έχει αυτό το όπλο", + ["command_goto"] = "Τηλεμεταφέρεστε σε έναν παίκτη", + ["command_kill"] = "Σκοτώστε έναν παίκτη", + ["command_save"] = "Εξαναγκαστική αποθήκευση δεδομένων ενός παίκτη", + ["command_saveall"] = "Εξαναγκαστική αποθήκευση όλων των δεδομένων των παικτών", + ["command_setaccountmoney"] = "Ορίστε τα χρήματα σε έναν καθορισμένο λογαριασμό", + ["command_setaccountmoney_amount"] = "Ποσό", + ["command_setcoords"] = "Τηλεμεταφερθείτε σε καθορισμένες συντεταγμένες", + ["command_setcoords_x"] = "Τιμή X", + ["command_setcoords_y"] = "Τιμή Y", + ["command_setcoords_z"] = "Τιμή Z", + ["command_setjob"] = "Ορίστε το επάγγελμα ενός παίκτη", + ["command_setjob_job"] = "Όνομα", + ["command_setjob_grade"] = "Βαθμός επαγγέλματος", + ["command_setjob_invalid"] = "Το επάγγελμα, ο βαθμός ή και οι δύο είναι μη έγκυρα", + ["command_setgroup"] = "Ορίστε την ομάδα δικαιωμάτων ενός παίκτη", + ["command_setgroup_group"] = "Όνομα Ομάδας", + ["commanderror_argumentmismatch"] = "Μη έγκυρος αριθμός ορισμάτων (δόθηκαν %s, αναμενόμενα %s)", + ["commanderror_argumentmismatch_number"] = "Μη έγκυρος τύπος δεδομένων για το όρισμα #%s (δόθηκε συμβολοσειρά, αναμενόμενος αριθμός)", + ["commanderror_argumentmismatch_string"] = "Μη έγκυρος τύπος δεδομένων για το όρισμα #%s (δόθηκε αριθμός, αναμενόμενη συμβολοσειρά)", + ["commanderror_invaliditem"] = "Μη έγκυρο αντικείμενο", + ["commanderror_invalidweapon"] = "Μη έγκυρο όπλο", + ["commanderror_console"] = "Η εντολή δεν μπορεί να εκτελεστεί από την κονσόλα", + ["commanderror_invalidcommand"] = "Μη έγκυρη εντολή - /%s", + ["commanderror_invalidplayerid"] = "Ο καθορισμένος παίκτης δεν είναι συνδεδεμένος", + ["commandgeneric_playerid"] = "Αναγνωριστικό διακομιστή του παίκτη", + ["command_giveammo_noweapon_found"] = "Ο %s δεν έχει αυτό το όπλο", + ["command_giveammo_weapon"] = "Όνομα όπλου", + ["command_giveammo_ammo"] = "Ποσότητα πυρομαχικών", + ["tpm_nowaypoint"] = "Δεν έχει οριστεί σημείο προορισμού.", + ["tpm_success"] = "Επιτυχής τηλεμεταφορά", + + ["noclip_message"] = "Το Noclip έχει %s", + ["enabled"] = "~g~ενεργοποιήθηκε~s~", + ["disabled"] = "~r~απενεργοποιήθηκε~s~", + + -- Ρυθμίσεις τοπικής γλώσσας + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "£%s", + + -- Όπλα + + -- Χειροποίητα + ["weapon_dagger"] = "Στιλέτο", + ["weapon_bat"] = "Μπαστούνι", + ["weapon_battleaxe"] = "Πολεμική σείρα", + ["weapon_bottle"] = "Μπουκάλι", + ["weapon_crowbar"] = "Ροπαλάκι", + ["weapon_flashlight"] = "Φακός", + ["weapon_golfclub"] = "Γκολφ", + ["weapon_hammer"] = "Σφυρί", + ["weapon_hatchet"] = "Πέλεκυς", + ["weapon_knife"] = "Μαχαίρι", + ["weapon_knuckle"] = "Χειροπέδες", + ["weapon_machete"] = "Μαχαίρι μαχαιροπίρουνου", + ["weapon_nightstick"] = "Ρόπαλο νυχτερίδας", + ["weapon_wrench"] = "Ροκανίδι", + ["weapon_poolcue"] = "Καστήλα", + ["weapon_stone_hatchet"] = "Πέλεκυς από πέτρα", + ["weapon_switchblade"] = "Ξυραφάκι", + + -- Πιστόλια + ["weapon_appistol"] = "AP Πιστόλι", + ["weapon_ceramicpistol"] = "Κεραμικό πιστόλι", + ["weapon_combatpistol"] = "Πολεμικό πιστόλι", + ["weapon_doubleaction"] = "Διπλής δράσης Ριβόλβερ", + ["weapon_navyrevolver"] = "Ναυτικό Ρεβόλβερ", + ["weapon_flaregun"] = "Πιστόλι αστραπών", + ["weapon_gadgetpistol"] = "Πιστόλι συσκευών", + ["weapon_heavypistol"] = "Βαρύ πιστόλι", + ["weapon_revolver"] = "Βαρύ Ρεβόλβερ", + ["weapon_revolver_mk2"] = "Βαρύ Ρεβόλβερ MK2", + ["weapon_marksmanpistol"] = "Πιστόλι μονομάχου", + ["weapon_pistol"] = "Πιστόλι", + ["weapon_pistol_mk2"] = "Πιστόλι MK2", + ["weapon_pistol50"] = "Πιστόλι .50", + ["weapon_snspistol"] = "Πιστόλι SNS", + ["weapon_snspistol_mk2"] = "Πιστόλι SNS MK2", + ["weapon_stungun"] = "Ηλεκτροπληξία", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Βιομηχανικό πιστόλι", + + -- Καραμπίνες + ["weapon_assaultshotgun"] = "Πολεμική Καραμπίνα", + ["weapon_autoshotgun"] = "Αυτόματη Καραμπίνα", + ["weapon_bullpupshotgun"] = "Bullpup Καραμπίνα", + ["weapon_combatshotgun"] = "Καραμπίνα πολέμου", + ["weapon_dbshotgun"] = "Διπλής κάννης Καραμπίνα", + ["weapon_heavyshotgun"] = "Βαριά Καραμπίνα", + ["weapon_musket"] = "Μουσκέτα", + ["weapon_pumpshotgun"] = "Καραμπίνα αντλίας", + ["weapon_pumpshotgun_mk2"] = "Καραμπίνα αντλίας MK2", + ["weapon_sawnoffshotgun"] = "Καραμπίνα με κοντά κάννη", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Πολεμικό SMG", + ["weapon_combatmg"] = "Πολεμικό MG", + ["weapon_combatmg_mk2"] = "Πολεμικό MG MK2", + ["weapon_combatpdw"] = "Πολεμικό PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Πιστόλι Αυτόματης Καραμπίνας", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Μικρό SMG", + ["weapon_minismg"] = "Μικρό SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Ανεξίτηλο Hellbringer", + + -- Καραμπίνες + ["weapon_advancedrifle"] = "Προηγμένη Καραμπίνα", + ["weapon_assaultrifle"] = "Καραμπίνα Επίθεσης", + ["weapon_assaultrifle_mk2"] = "Καραμπίνα Επίθεσης MK2", + ["weapon_bullpuprifle"] = "Bullpup Καραμπίνα", + ["weapon_bullpuprifle_mk2"] = "Bullpup Καραμπίνα MK2", + ["weapon_carbinerifle"] = "Καραμπίνα", + ["weapon_carbinerifle_mk2"] = "Καραμπίνα MK2", + ["weapon_compactrifle"] = "Συμπαγής Καραμπίνα", + ["weapon_militaryrifle"] = "Στρατιωτική Καραμπίνα", + ["weapon_specialcarbine"] = "Ειδική Καραμπίνα", + ["weapon_specialcarbine_mk2"] = "Ειδική Καραμπίνα MK2", + + -- Κυνηγετικά + ["weapon_heavysniper"] = "Βαρύ Κυνηγετικό Ρίφλε", + ["weapon_heavysniper_mk2"] = "Βαρύ Κυνηγετικό Ρίφλε MK2", + ["weapon_marksmanrifle"] = "Ρίφλε Επαγγελματία Σκοπευτή", + ["weapon_marksmanrifle_mk2"] = "Ρίφλε Επαγγελματία Σκοπευτή MK2", + ["weapon_sniperrifle"] = "Κυνηγετικό Ρίφλε", + ["weapon_heavyrifle"] = "βαρύ τουφέκι", + + -- Βαριά / Εκτοξευτές + ["weapon_compactlauncher"] = "Συμπαγής Εκτοξευτής", + ["weapon_firework"] = "Εκτοξευτής Πυροτεχνημάτων", + ["weapon_grenadelauncher"] = "Εκτοξευτής Γρανατών", + ["weapon_hominglauncher"] = "Εκτοξευτής Εξόρυξης", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Εκτοξευτής Πυραύλων", + ["weapon_rayminigun"] = "Widowmaker", + + -- Επιπλέον Όπλα από το Criminal Enterprises DLC + ["weapon_metaldetector"] = "Ανιχνευτής Μετάλλων", + ["weapon_precisionrifle"] = "Όπλο Ακρίβειας", + ["weapon_tactilerifle"] = "Όπλο Εξυπηρέτησης", + + -- Drug wars dlc + ["weapon_candycane"] = "Candycane", + ["weapon_acidpackage"] = "Acid Package", + ["weapon_pistolxm3"] = "Pistol8 x3m", + ["weapon_railgunxm3"] = "Railgun", + + -- Ρίψεις + ["weapon_ball"] = "Μπάλα", + ["weapon_bzgas"] = "BZ Gas", + ["weapon_flare"] = "Πυροτεχνήματα", + ["weapon_grenade"] = "Χειροβομβίδα", + ["weapon_petrolcan"] = "Κανέλα Βενζίνης", + ["weapon_hazardcan"] = "Κανέλα Επικίνδυνης Υλικότητας", + ["weapon_molotov"] = "Μολότοφ", + ["weapon_proxmine"] = "Νάρκη Εγγύτητας", + ["weapon_pipebomb"] = "Βόμβα Σωλήνα", + ["weapon_snowball"] = "Χιονόμπαλα", + ["weapon_stickybomb"] = "Κολλητή Βόμβα", + ["weapon_smokegrenade"] = "Δακρυγόνο", + + -- Ειδικά + ["weapon_fireextinguisher"] = "Πυροσβεστήρας", + ["weapon_digiscanner"] = "Ψηφιακός Σαρωτής", + ["weapon_garbagebag"] = "Σακούλα Απορριμμάτων", + ["weapon_handcuffs"] = "Χειροπέδες", + ["gadget_nightvision"] = "Νυχτερινή Όραση", + ["gadget_parachute"] = "Αλεξίπτωτο", + + -- Συστατικά Όπλων + ["component_knuckle_base"] = "Βασικό Μοντέλο", + ["component_knuckle_pimp"] = "Ο Φιλότιμος", + ["component_knuckle_ballas"] = "Οι Ballas", + ["component_knuckle_dollar"] = "Ο Εξαπατητής", + ["component_knuckle_diamond"] = "Η Ρόκα", + ["component_knuckle_hate"] = "Ο Μισητός", + ["component_knuckle_love"] = "Ο Εραστής", + ["component_knuckle_player"] = "Ο Παίκτης", + ["component_knuckle_king"] = "Ο Βασιλιάς", + ["component_knuckle_vagos"] = "Οι Vagos", + + ["component_luxary_finish"] = "Πολυτελές Φινίρισμα Όπλου", + + ["component_handle_default"] = "Προεπιλεγμένη Χειρολαβή", + ["component_handle_vip"] = "Χειρολαβή VIP", + ["component_handle_bodyguard"] = "Χειρολαβή Σωματοφύλακα", + + ["component_vip_finish"] = "Πολυτελές Φινίρισμα VIP", + ["component_bodyguard_finish"] = "Πολυτελές Φινίρισμα Σωματοφύλακα", + + ["component_camo_finish"] = "Ψηφιακό Καμουφλάζ", + ["component_camo_finish2"] = "Καμουφλάζ Πινελίου", + ["component_camo_finish3"] = "Καμουφλάζ Δάσους", + ["component_camo_finish4"] = "Καμουφλάζ Κρανίου", + ["component_camo_finish5"] = "Καμουφλάζ Sessanta Nove", + ["component_camo_finish6"] = "Καμουφλάζ Perseus", + ["component_camo_finish7"] = "Καμουφλάζ Λεοπάρδαλης", + ["component_camo_finish8"] = "Καμουφλάζ Ζέβρας", + ["component_camo_finish9"] = "Γεωμετρικό Καμουφλάζ", + ["component_camo_finish10"] = "Καμουφλάζ Boom", + ["component_camo_finish11"] = "Πατριωτικό Καμουφλάζ", + + ["component_camo_slide_finish"] = "Ψηφιακό Καμουφλάζ Slide", + ["component_camo_slide_finish2"] = "Καμουφλάζ Πινελίου Slide", + ["component_camo_slide_finish3"] = "Καμουφλάζ Δάσους Slide", + ["component_camo_slide_finish4"] = "Καμουφλάζ Κρανίου Slide", + ["component_camo_slide_finish5"] = "Καμουφλάζ Sessanta Nove Slide", + ["component_camo_slide_finish6"] = "Καμουφλάζ Perseus Slide", + ["component_camo_slide_finish7"] = "Καμουφλάζ Λεοπάρδαλης Slide", + ["component_camo_slide_finish8"] = "Καμουφλάζ Ζέβρας Slide", + ["component_camo_slide_finish9"] = "Γεωμετρικό Καμουφλάζ Slide", + ["component_camo_slide_finish10"] = "Καμουφλάζ Boom Slide", + ["component_camo_slide_finish11"] = "Πατριωτικό Καμουφλάζ Slide", + + ["component_clip_default"] = "Προεπιλεγμένο Περιοδικό", + ["component_clip_extended"] = "Επέκταση Περιοδικού", + ["component_clip_drum"] = "Περιοδικό Κάδος", + ["component_clip_box"] = "Περιοδικό Κιβώτιο", + + ["component_scope_holo"] = "Ολογραφική Σκοπευτική Συσκευή", + ["component_scope_small"] = "Μικρή Σκοπευτική Συσκευή", + ["component_scope_medium"] = "Μεσαία Σκοπευτική Συσκευή", + ["component_scope_large"] = "Μεγάλη Σκοπευτική Συσκευή", + ["component_scope"] = "Σκοπευτική Συσκευή Εγκατεστημένη", + ["component_scope_advanced"] = "Προηγμένη Σκοπευτική Συσκευή", + ["component_ironsights"] = "Σκοπευτικά Σιδερά", + + ["component_suppressor"] = "Καταστεναγματοποιητής", + ["component_compensator"] = "Αποζημιωτής", + + ["component_muzzle_flat"] = "Επίπεδο Φρένο Αέρα", + ["component_muzzle_tactical"] = "Τακτικό Φρένο Αέρα", + ["component_muzzle_fat"] = "Φρένο Αέρα Παχύ Άκρο", + ["component_muzzle_precision"] = "Φρένο Αέρα Ακρίβειας", + ["component_muzzle_heavy"] = "Φρένο Αέρα Βαρέως Τύπου", + ["component_muzzle_slanted"] = "Φρένο Αέρα Ανοιγοκλειστό", + ["component_muzzle_split"] = "Φρένο Αέρα Υποκλιμακούμενο", + ["component_muzzle_squared"] = "Φρένο Αέρα Τετραγωνισμένο", + + ["component_flashlight"] = "Φακός", + ["component_grip"] = "Λαβή", + + ["component_barrel_default"] = "Προεπιλεγμένο Κάννα", + ["component_barrel_heavy"] = "Βαριά Κάννα", + + ["component_ammo_tracer"] = "Σφαίρες με Ιχνηθέν Φωτός", + ["component_ammo_incendiary"] = "Σφαίρες Φωτιάς", + ["component_ammo_hollowpoint"] = "Σφαίρες Κενές Άκρες", + ["component_ammo_fmj"] = "Σφαίρες FMJ", + ["component_ammo_armor"] = "Σφαίρες Διάτρησης Θωράκισης", + ["component_ammo_explosive"] = "Εκρηκτικές Σφαίρες Διάτρησης Θωράκισης", + + ["component_shells_default"] = "Προεπιλεγμένες Φυσίγγια", + ["component_shells_incendiary"] = "Φυσίγγια Διαμαντινών", + ["component_shells_armor"] = "Φυσίγγια Θωράκισης Χάλυβα", + ["component_shells_hollowpoint"] = "Φυσίγγια Κενών Άκρων", + ["component_shells_explosive"] = "Φυσίγγια Εκρηκτικών", + + -- Πυρομαχικά Όπλων + ["ammo_rounds"] = "σφαιρίδιο(α)", + ["ammo_shells"] = "φυσίγγιο(α)", + ["ammo_charge"] = "φορτίο", + ["ammo_petrol"] = "γαλόνια καυσίμου", + ["ammo_firework"] = "πυροτεχνήματο(α)", + ["ammo_rockets"] = "πύραυλο(ι)", + ["ammo_grenadelauncher"] = "χειροβομβίδα(ες)", + ["ammo_grenade"] = "χειροβομβίδα(ες)", + ["ammo_stickybomb"] = "βόμβα(ες)", + ["ammo_pipebomb"] = "βόμβα(ες)", + ["ammo_smokebomb"] = "βόμβα(ες) καπνού", + ["ammo_molotov"] = "κοκτέιλ μολότοφ(α)", + ["ammo_proxmine"] = "μίνα(ες) εγγύτητας", + ["ammo_bzgas"] = "κανίστρα(ες)", + ["ammo_ball"] = "μπάλα(ες)", + ["ammo_snowball"] = "χιονόμπαλα(ες)", + ["ammo_flare"] = "φλογοβολίδα(ες)", + ["ammo_flaregun"] = "φλογοβολίδα(ες)", + + -- Επιστρώσεις Όπλων + ["tint_default"] = "προεπιλεγμένο δέρμα", + ["tint_green"] = "πράσινο δέρμα", + ["tint_gold"] = "χρυσό δέρμα", + ["tint_pink"] = "ροζ δέρμα", + ["tint_army"] = "στρατιωτικό δέρμα", + ["tint_lspd"] = "μπλε δέρμα", + ["tint_orange"] = "πορτοκαλί δέρμα", + ["tint_platinum"] = "πλατίνενο δέρμα", +} diff --git a/server-data/resources/[esx]/es_extended/locales/en.lua b/server-data/resources/[esx]/es_extended/locales/en.lua index bcabfafd6..90521548a 100644 --- a/server-data/resources/[esx]/es_extended/locales/en.lua +++ b/server-data/resources/[esx]/es_extended/locales/en.lua @@ -1,5 +1,12 @@ Locales["en"] = { -- Inventory + ["inventory"] = "Inventory ( Weight %s / %s )", + ["use"] = "Use", + ["give"] = "Give", + ["remove"] = "Throw", + ["return"] = "Return", + ["give_to"] = "Give to", + ["amount"] = "Amount", ["giveammo"] = "Give ammo", ["amountammo"] = "Ammo Amount", ["noammo"] = "Not Enough!", @@ -29,8 +36,10 @@ Locales["en"] = { ["threw_weapon_already"] = "You already have this weapon", ["threw_cannot_pickup"] = "Inventory is full, Cannot Pickup!", ["threw_pickup_prompt"] = "Press E to Pickup", + -- Key mapping ["keymap_showinventory"] = "Show Inventory", + -- Salary related ["received_salary"] = "You have been paid: $%s", ["received_help"] = "You have been paid your welfare check: $%s", @@ -40,14 +49,20 @@ Locales["en"] = { ["account_bank"] = "Bank", ["account_black_money"] = "Dirty Money", ["account_money"] = "Cash", + ["act_imp"] = "Cannot Perform Action", ["in_vehicle"] = "Cannot Perform Action, Player is in a vehicle", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", + -- Commands ["command_bring"] = "Bring player to you", ["command_car"] = "Spawn a vehicle", ["command_car_car"] = "Vehicle model or hash", ["command_cardel"] = "Remove vehicles in proximity", ["command_cardel_radius"] = "Removes all vehicles within the specified radius", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", ["command_clear"] = "Clear chat Text", ["command_clearall"] = "Clear chat Text for all players", ["command_clearinventory"] = "Remove All items from the Players Inventory", @@ -58,6 +73,10 @@ Locales["en"] = { ["command_giveaccountmoney_account"] = "Account to add to", ["command_giveaccountmoney_amount"] = "Amount to add", ["command_giveaccountmoney_invalid"] = "Account Name Invalid", + ["command_removeaccountmoney"] = "Remove Money from a specified Account", + ["command_removeaccountmoney_account"] = "Account to remove from", + ["command_removeaccountmoney_amount"] = "Amount to remove", + ["command_removeaccountmoney_invalid"] = "Account Name Invalid", ["command_giveitem"] = "Give Player an item", ["command_giveitem_item"] = "Item name", ["command_giveitem_count"] = "Quantity", @@ -71,6 +90,7 @@ Locales["en"] = { ["command_giveweaponcomponent_hasalready"] = "Player already has this weapon component", ["command_giveweaponcomponent_missingweapon"] = "Player does not have this weapon", ["command_goto"] = "Teleport yourself to a player", + ["command_kill"] = "Kill a player", ["command_save"] = "Force Save a player`s Data", ["command_saveall"] = "Force Save all player data", ["command_setaccountmoney"] = "Set the money within a specified account", @@ -87,20 +107,29 @@ Locales["en"] = { ["command_setgroup_group"] = "Name of Group", ["commanderror_argumentmismatch"] = "Invalid Argument Count (passed %s, wanted %s)", ["commanderror_argumentmismatch_number"] = "Invalid Argument #%s data type (passed string, wanted number)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", ["commanderror_invaliditem"] = "Invalid item", ["commanderror_invalidweapon"] = "Invalid weapon", ["commanderror_console"] = "Command Cannot be executed from console", ["commanderror_invalidcommand"] = "Invalid Command - /%s", ["commanderror_invalidplayerid"] = "Specified Player is not online", ["commandgeneric_playerid"] = "Player`s Server Id", - ["tpm_success"] = "teleport done", - ["nowaipoint"] = "no waipoint", - ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", - ["command_repair"] = "Repair your vehicle", - ["command_repair_success"] = "Successfully repaired vehicle", + ["command_giveammo_noweapon_found"] = "%s does not have that weapon", + ["command_giveammo_weapon"] = "Weapon name", + ["command_giveammo_ammo"] = "Ammo Quantity", + ["tpm_nowaypoint"] = "No Waypoint Set.", + ["tpm_success"] = "Successfully Teleported", + + ["noclip_message"] = "Noclip has been %s", + ["enabled"] = "~g~enabled~s~", + ["disabled"] = "~r~disabled~s~", + -- Locale settings ["locale_digit_grouping_symbol"] = ",", ["locale_currency"] = "£%s", + + -- Weapons + -- Melee ["weapon_dagger"] = "Dagger", ["weapon_bat"] = "Bat", @@ -119,6 +148,7 @@ Locales["en"] = { ["weapon_poolcue"] = "Pool Cue", ["weapon_stone_hatchet"] = "Stone Hatchet", ["weapon_switchblade"] = "Switchblade", + -- Handguns ["weapon_appistol"] = "AP Pistol", ["weapon_ceramicpistol"] = "Ceramic Pistol", @@ -139,6 +169,7 @@ Locales["en"] = { ["weapon_stungun"] = "Taser", ["weapon_raypistol"] = "Up-N-Atomizer", ["weapon_vintagepistol"] = "Vintage Pistol", + -- Shotguns ["weapon_assaultshotgun"] = "Assault Shotgun", ["weapon_autoshotgun"] = "Auto Shotgun", @@ -150,6 +181,7 @@ Locales["en"] = { ["weapon_pumpshotgun"] = "Pump Shotgun", ["weapon_pumpshotgun_mk2"] = "Pump Shotgun MK2", ["weapon_sawnoffshotgun"] = "Sawed Off Shotgun", + -- SMG & LMG ["weapon_assaultsmg"] = "Assault SMG", ["weapon_combatmg"] = "Combat MG", @@ -163,6 +195,7 @@ Locales["en"] = { ["weapon_smg"] = "SMG", ["weapon_smg_mk2"] = "SMG MK2", ["weapon_raycarbine"] = "Unholy Hellbringer", + -- Rifles ["weapon_advancedrifle"] = "Advanced Rifle", ["weapon_assaultrifle"] = "Assault Rifle", @@ -175,12 +208,15 @@ Locales["en"] = { ["weapon_militaryrifle"] = "Military Rifle", ["weapon_specialcarbine"] = "Special Carbine", ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", + -- Sniper ["weapon_heavysniper"] = "Heavy Sniper", ["weapon_heavysniper_mk2"] = "Heavy Sniper MK2", ["weapon_marksmanrifle"] = "Marksman Rifle", ["weapon_marksmanrifle_mk2"] = "Marksman Rifle MK2", ["weapon_sniperrifle"] = "Sniper Rifle", + -- Heavy / Launchers ["weapon_compactlauncher"] = "Compact Launcher", ["weapon_firework"] = "Firework Launcher", @@ -190,10 +226,18 @@ Locales["en"] = { ["weapon_railgun"] = "Railgun", ["weapon_rpg"] = "Rocket Launcher", ["weapon_rayminigun"] = "Widowmaker", + -- Criminal Enterprises DLC ["weapon_metaldetector"] = "Metal Detector", ["weapon_precisionrifle"] = "Precision Rifle", ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug wars dlc + ["weapon_candycane"] = "Candycane", + ["weapon_acidpackage"] = "Acid Package", + ["weapon_pistolxm3"] = "Pistol8 x3m", + ["weapon_railgunxm3"] = "Railgun", + -- Thrown ["weapon_ball"] = "Baseball", ["weapon_bzgas"] = "BZ Gas", @@ -207,6 +251,7 @@ Locales["en"] = { ["weapon_snowball"] = "Snowball", ["weapon_stickybomb"] = "Sticky Bomb", ["weapon_smokegrenade"] = "Tear Gas", + -- Special ["weapon_fireextinguisher"] = "Fire Extinguisher", ["weapon_digiscanner"] = "Digital Scanner", @@ -214,6 +259,7 @@ Locales["en"] = { ["weapon_handcuffs"] = "Handcuffs", ["gadget_nightvision"] = "Night Vision", ["gadget_parachute"] = "parachute", + -- Weapon Components ["component_knuckle_base"] = "base Model", ["component_knuckle_pimp"] = "the Pimp", @@ -225,12 +271,16 @@ Locales["en"] = { ["component_knuckle_player"] = "the Player", ["component_knuckle_king"] = "the King", ["component_knuckle_vagos"] = "the Vagos", + ["component_luxary_finish"] = "luxary Weapon Finish", + ["component_handle_default"] = "default Handle", ["component_handle_vip"] = "vIP Handle", ["component_handle_bodyguard"] = "bodyguard Handle", + ["component_vip_finish"] = "vIP Finish", ["component_bodyguard_finish"] = "bodyguard Finish", + ["component_camo_finish"] = "digital Camo", ["component_camo_finish2"] = "brushstroke Camo", ["component_camo_finish3"] = "woodland Camo", @@ -242,6 +292,7 @@ Locales["en"] = { ["component_camo_finish9"] = "geometric Camo", ["component_camo_finish10"] = "boom Camo", ["component_camo_finish11"] = "patriotic Camo", + ["component_camo_slide_finish"] = "digital Slide Camo", ["component_camo_slide_finish2"] = "brushstroke Slide Camo", ["component_camo_slide_finish3"] = "woodland Slide Camo", @@ -253,10 +304,12 @@ Locales["en"] = { ["component_camo_slide_finish9"] = "geometric Slide Camo", ["component_camo_slide_finish10"] = "boom Slide Camo", ["component_camo_slide_finish11"] = "patriotic Slide Camo", + ["component_clip_default"] = "default Magazine", ["component_clip_extended"] = "extended Magazine", ["component_clip_drum"] = "drum Magazine", ["component_clip_box"] = "box Magazine", + ["component_scope_holo"] = "holographic Scope", ["component_scope_small"] = "small Scope", ["component_scope_medium"] = "medium Scope", @@ -264,8 +317,10 @@ Locales["en"] = { ["component_scope"] = "mounted Scope", ["component_scope_advanced"] = "advanced Scope", ["component_ironsights"] = "ironsights", + ["component_suppressor"] = "suppressor", ["component_compensator"] = "compensator", + ["component_muzzle_flat"] = "flat Muzzle Brake", ["component_muzzle_tactical"] = "tactical Muzzle Brake", ["component_muzzle_fat"] = "fat-End Muzzle Brake", @@ -274,21 +329,26 @@ Locales["en"] = { ["component_muzzle_slanted"] = "slanted Muzzle Brake", ["component_muzzle_split"] = "split-End Muzzle Brake", ["component_muzzle_squared"] = "squared Muzzle Brake", + ["component_flashlight"] = "flashlight", ["component_grip"] = "grip", + ["component_barrel_default"] = "default Barrel", ["component_barrel_heavy"] = "heavy Barrel", + ["component_ammo_tracer"] = "tracer Ammo", ["component_ammo_incendiary"] = "incendiary Ammo", ["component_ammo_hollowpoint"] = "hollowpoint Ammo", ["component_ammo_fmj"] = "fMJ Ammo", ["component_ammo_armor"] = "armor Piercing Ammo", ["component_ammo_explosive"] = "armor Piercing Incendiary Ammo", + ["component_shells_default"] = "default Shells", ["component_shells_incendiary"] = "dragons Breath Shells", ["component_shells_armor"] = "steel Buckshot Shells", ["component_shells_hollowpoint"] = "flechette Shells", ["component_shells_explosive"] = "explosive Slug Shells", + -- Weapon Ammo ["ammo_rounds"] = "round(s)", ["ammo_shells"] = "shell(s)", @@ -308,6 +368,7 @@ Locales["en"] = { ["ammo_snowball"] = "snowball(s)", ["ammo_flare"] = "flare(s)", ["ammo_flaregun"] = "flare(s)", + -- Weapon Tints ["tint_default"] = "default skin", ["tint_green"] = "green skin", diff --git a/server-data/resources/[esx]/es_extended/locales/es.lua b/server-data/resources/[esx]/es_extended/locales/es.lua index e2e2f4b78..92b8446cb 100644 --- a/server-data/resources/[esx]/es_extended/locales/es.lua +++ b/server-data/resources/[esx]/es_extended/locales/es.lua @@ -1,5 +1,12 @@ Locales["es"] = { -- Inventory + ["inventory"] = "Inventario %s / %s", + ["use"] = "Usar", + ["give"] = "Dar", + ["remove"] = "Tirar", + ["return"] = "Volver", + ["give_to"] = "Dar a", + ["amount"] = "Cantidad", ["giveammo"] = "Dar munición", ["amountammo"] = "Cantidad de munición", ["noammo"] = "No tienes suficiente munición!", @@ -43,16 +50,20 @@ Locales["es"] = { ["account_black_money"] = "Dinero Negro", ["account_money"] = "Efectivo", - ["act_imp"] = "Acción imposible", - ["in_vehicle"] = "No se puede dar nada a alguien en un vehículo", + ["act_imp"] = "No se pudo realizar la acción.", + ["in_vehicle"] = "Acción rechazada. El jugador se encuentra en un vehículo", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", -- Commands ["command_bring"] = "Traer un jugador hacia ti", - ["command_car"] = "Generar un vehiculo", - ["command_car_car"] = "Nombre o hash del vehículo", + ["command_car"] = "Spawnear un vehículo", + ["command_car_car"] = "Nombre del vehículo", ["command_cardel"] = "Eliminar vehículos cercanos", ["command_cardel_radius"] = "Opcional, eliminar todos los vehículos en el radio especificado", - ["command_clear"] = "Limpiar chat", + ["command_repair"] = "Reparar tu vehiculo", + ["command_repair_success"] = "Vehiculo reparado correctamente", + ["command_repair_success_target"] = "Un administrador reparo tu vehiculo", + ["command_clear"] = "Limpiar chat para ti", ["command_clearall"] = "Limpiar chat para todos los jugadores", ["command_clearinventory"] = "Limpiar el inventario del jugador", ["command_clearloadout"] = "Limpiar inventario de un jugador", @@ -61,7 +72,7 @@ Locales["es"] = { ["command_giveaccountmoney"] = "Dar dinero", ["command_giveaccountmoney_account"] = "Nombre de cuenta válido", ["command_giveaccountmoney_amount"] = "Cantidad a añadir", - ["command_giveaccountmoney_invalid"] = "Nombre de cuenta inválido", + ["command_giveaccountmoney_invalid"] = "Nombre de cuenta no existente. [bank, money, black_money]", ["command_giveitem"] = "Dar un objeto a un jugador", ["command_giveitem_item"] = "Nombre del artículo", ["command_giveitem_count"] = "Cantidad de articulos", @@ -74,11 +85,12 @@ Locales["es"] = { ["command_giveweaponcomponent_invalid"] = "Componente del arma no válido", ["command_giveweaponcomponent_hasalready"] = "El jugador ya tiene ese componente del arma", ["command_giveweaponcomponent_missingweapon"] = "El jugador no tiene esa arma", - ["command_goto"] = "Teletransporte hacia un jugador", - ["command_save"] = "Guardar un jugador en la base de datos", - ["command_saveall"] = "Guardar todos los jugadores en la base de datos", + ["command_goto"] = "Teletransportarte hacia un jugador", + ["command_kill"] = "Matar un jugador", + ["command_save"] = "Guardar la informacion de un jugador en la base de datos.", + ["command_saveall"] = "Guardar toda la informacion de jugadores en la base de datos.", ["command_setaccountmoney"] = "Establecer el dinero de la cuenta para un jugador", - ["command_setaccountmoney_amount"] = "Cantidad de dinero para fijar", + ["command_setaccountmoney_amount"] = "Cantidad de dinero a establecer", ["command_setcoords"] = "Teletransporte a coordenadas", ["command_setcoords_x"] = "Eje X", ["command_setcoords_y"] = "Eje Y", @@ -86,17 +98,21 @@ Locales["es"] = { ["command_setjob"] = "Dar un trabajo a un jugador", ["command_setjob_job"] = "Nombre del trabajo", ["command_setjob_grade"] = "Rango del trabajo", - ["command_setjob_invalid"] = "El trabajo, el rango o ambos no son válidos", + ["command_setjob_invalid"] = "El trabajo o el rango no son válidos", ["command_setgroup"] = "Establecer el grupo de un jugador", ["command_setgroup_group"] = "Nombre del grupo", - ["commanderror_argumentmismatch"] = "error en el recuento de argumentos (pasado %s, deseado %s)", - ["commanderror_argumentmismatch_number"] = "argumento #%s tipo no coincide (cadena pasada, número deseado)", + ["commanderror_argumentmismatch"] = "Error en el recuento de argumentos (pasado %s, deseado %s)", + ["commanderror_argumentmismatch_number"] = "Argumento #%s tipo no coincide (cadena pasada, número deseado)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", ["commanderror_invaliditem"] = "Nombre del artículo no válido", ["commanderror_invalidweapon"] = "Arma inválida", ["commanderror_console"] = "Ese comando no se puede ejecutar desde la consola", ["commanderror_invalidcommand"] = "/%s ¡No es un comando válido!", - ["commanderror_invalidplayerid"] = "No hay ningún jugador en línea que coincida con la ID del servidor", + ["commanderror_invalidplayerid"] = "No hay ningún jugador online con la ID especificada", ["commandgeneric_playerid"] = "ID del jugador", + ["command_giveammo_noweapon_found"] = "%s no posee esa arma", + ["command_giveammo_weapon"] = "Nombre del arma", + ["command_giveammo_ammo"] = "Cantidad de municion", -- Locale settings ["locale_digit_grouping_symbol"] = ",", @@ -104,6 +120,12 @@ Locales["es"] = { -- Weapons + -- Drug Wars DLC + ["weapon_candycane"] = "Hacha de Caramelo ", + ["weapon_acidpackage"] = "Paquete de Acido", + ["weapon_pistolxm3"] = "Pistola WM 29", + ["weapon_railgunxm3"] = "Fusil electromagnético", + -- Melee ["weapon_dagger"] = "Daga", ["weapon_bat"] = "Bate", @@ -111,11 +133,11 @@ Locales["es"] = { ["weapon_bottle"] = "Botella", ["weapon_crowbar"] = "Palanca", ["weapon_flashlight"] = "Linterna", - ["weapon_golfclub"] = "Palos de Golf", + ["weapon_golfclub"] = "Palo de Golf", ["weapon_hammer"] = "Martillo", ["weapon_hatchet"] = "Hacha", ["weapon_knife"] = "Cuchillo", - ["weapon_knuckle"] = "Puños Americanos", + ["weapon_knuckle"] = "Puño Americano", ["weapon_machete"] = "Machete", ["weapon_nightstick"] = "Porra", ["weapon_wrench"] = "Llave Inglesa", @@ -124,9 +146,9 @@ Locales["es"] = { ["weapon_switchblade"] = "Navaja", -- Handguns - ["weapon_appistol"] = "Pistola AP ", - ["weapon_ceramicpistol"] = "Pistola Corta", - ["weapon_combatpistol"] = "Pistola Combate", + ["weapon_appistol"] = "Pistola AP", + ["weapon_ceramicpistol"] = "Pistola de Ceramica", + ["weapon_combatpistol"] = "Pistola de Combate", ["weapon_doubleaction"] = "Revólver de Doble Acción", ["weapon_navyrevolver"] = "Revólver de la Armada", ["weapon_flaregun"] = "Pistola de Bengalas", @@ -135,12 +157,12 @@ Locales["es"] = { ["weapon_revolver"] = "Revólver Pesado", ["weapon_revolver_mk2"] = "Revólver Pesado MK2", ["weapon_marksmanpistol"] = "Pistola Marksman", - ["weapon_pistol"] = "Pistola", + ["weapon_pistol"] = "Pistola 9mm", ["weapon_pistol_mk2"] = "Pistola MK2", ["weapon_pistol50"] = "Pistola .50", ["weapon_snspistol"] = "Pistola SNS", ["weapon_snspistol_mk2"] = "Pistola SNS MK2", - ["weapon_stungun"] = "Tazer", + ["weapon_stungun"] = "Taser", ["weapon_raypistol"] = "Up-N-Atomizer", ["weapon_vintagepistol"] = "Pistola Vintage", @@ -182,6 +204,7 @@ Locales["es"] = { ["weapon_militaryrifle"] = "Rifle Militar", ["weapon_specialcarbine"] = "Carabina Especial", ["weapon_specialcarbine_mk2"] = "Carabina Especial MK2", + ["weapon_heavyrifle"] = "Rifle Pesado", -- Sniper ["weapon_heavysniper"] = "Francotirador Pesado", @@ -209,9 +232,9 @@ Locales["es"] = { ["weapon_hazardcan"] = "Bidón de Gasolina Peligroso", ["weapon_molotov"] = "Molotov", ["weapon_proxmine"] = "Mina de Proximidad ", - ["weapon_pipebomb"] = "Bomba de Tubo", + ["weapon_pipebomb"] = "Bomba casera", ["weapon_snowball"] = "Bola de nieve", - ["weapon_stickybomb"] = "Bomba Pegajosa", + ["weapon_stickybomb"] = "C4", ["weapon_smokegrenade"] = "Granada de Humo", -- Special @@ -272,7 +295,7 @@ Locales["es"] = { ["component_clip_drum"] = "Cargador Barril", ["component_clip_box"] = "Caja de Cargador", - ["component_scope_holo"] = "Mira Holográfico", + ["component_scope_holo"] = "Mira Holográfica", ["component_scope_small"] = "Mira Pequeña", ["component_scope_medium"] = "Mira Mediana", ["component_scope_large"] = "Mira Larga", @@ -280,8 +303,8 @@ Locales["es"] = { ["component_scope_advanced"] = "Mira Avanzada", ["component_ironsights"] = "Mira de Hierro", - ["component_suppressor"] = "Supresor", - ["component_compensator"] = "Compensador", + ["component_suppressor"] = "Silenciador", + ["component_compensator"] = "Estabilizador", ["component_muzzle_flat"] = "Boquilla de Freno Plana", ["component_muzzle_tactical"] = "Boquilla de Freno Tactica", @@ -332,7 +355,7 @@ Locales["es"] = { ["ammo_flaregun"] = "Bengala(s)", -- Weapon Tints - ["tint_default"] = "Skin Por Defecto", + ["tint_default"] = "Skin común", ["tint_green"] = "Skin Verde", ["tint_gold"] = "Skin Oro", ["tint_pink"] = "Skin Rosa", @@ -340,4 +363,8 @@ Locales["es"] = { ["tint_lspd"] = "Skin Azul", ["tint_orange"] = "Skin Naranja", ["tint_platinum"] = "Skin Plata", + + -- Duty related + ["stopped_duty"] = "Has salido de servicio.", + ["started_duty"] = "Has entrado de servicio.", } diff --git a/server-data/resources/[esx]/es_extended/locales/fi.lua b/server-data/resources/[esx]/es_extended/locales/fi.lua index cb525b79f..3103abd61 100644 --- a/server-data/resources/[esx]/es_extended/locales/fi.lua +++ b/server-data/resources/[esx]/es_extended/locales/fi.lua @@ -1,218 +1,240 @@ Locales["fi"] = { -- Inventory - ["giveammo"] = "anna ammuksia", - ["amountammo"] = "ammusten määrä", - ["noammo"] = "sinulla ei ole ammuksia!", - ["gave_item"] = "sinä annoit %sx %s henkilölle %s", - ["received_item"] = "sinä sait %sx %s henkilöltä %s", - ["gave_weapon"] = "you gave 1x %s to %s", - ["gave_weapon_ammo"] = "you gave ~o~%sx %s for %s to %s", - ["gave_weapon_withammo"] = "you gave 1x %s with ~o~%sx %s to %s", - ["gave_weapon_hasalready"] = "%s already have an %s", - ["gave_weapon_noweapon"] = "%s does not have that weapon", - ["received_weapon"] = "you received 1x %s from %s", - ["received_weapon_ammo"] = "you received ~o~%sx %s for your %s from %s", - ["received_weapon_withammo"] = "you received 1x %s with ~o~%sx %s from %s", - ["received_weapon_hasalready"] = "%s attempted to give you an %s, but you already have one", - ["received_weapon_noweapon"] = "%s attempted to give you ammo for an %s, but you don't have one", - ["gave_account_money"] = "sinä annoit $%s (%s) henkilölle %s", - ["received_account_money"] = "sinä sait $%s (%s) henkilöltä %s", - ["amount_invalid"] = "virheellinen määrä", - ["players_nearby"] = "ei pelaajia lähettyvillä", - ["ex_inv_lim"] = "toiminto mahdoton, reppu alkaa olla täysi %s", - ["imp_invalid_quantity"] = "toiminto mahdoton, virheellinen määrä", - ["imp_invalid_amount"] = "toiminto mahdoton, virhellinen summa", - ["threw_standard"] = "you threw %sx %s", - ["threw_account"] = "you threw $%s %s", - ["threw_weapon"] = "you threw 1x %s", - ["threw_weapon_ammo"] = "you threw 1x %s with ~o~%sx %s", - ["threw_weapon_already"] = "you already carry the same weapon", - ["threw_cannot_pickup"] = "you cannot pickup that because your inventory is full!", - ["threw_pickup_prompt"] = "press E to pickup", + ["inventory"] = "Reppu %s / %s", + ["use"] = "Käytä", + ["give"] = "Anna", + ["remove"] = "Poista", + ["return"] = "Takaisin", + ["give_to"] = "Anna henkilölle", + ["amount"] = "Määrä", + ["giveammo"] = "Anna ammuksia", + ["amountammo"] = "Ammusten määrä", + ["noammo"] = "Sinulla ei ole ammuksia!", + ["gave_item"] = "Sinä annoit %sx %s henkilölle %s", + ["received_item"] = "Sinä sait %sx %s henkilöltä %s", + ["gave_weapon"] = "Sinä annoit 1x %s henkilölle %s", + ["gave_weapon_ammo"] = "Annoit ~o~%sx %s kohteelle %s henkilölle %s", + ["gave_weapon_withammo"] = "Sinä annoit 1x %s ammuksella ~o~%sx %s henkilölle %s", + ["gave_weapon_hasalready"] = "%s omistaa jo %s", + ["gave_weapon_noweapon"] = "%s ei ole kyseistä asetta", + ["received_weapon"] = "Vastaanotit 1x %s henkilöltä %s", + ["received_weapon_ammo"] = "Sinä sait ~o~%sx %s sinun %s varten henkilöltä %s", + ["received_weapon_withammo"] = "Sinä sait 1x %s ammuksella ~o~%sx %s henkilöltä %s", + ["received_weapon_hasalready"] = "%s yritti antaa sinulle %s, mutta sinulla on jo sellainen", + ["received_weapon_noweapon"] = "%s yritti antaa sinulle ammuksia %s:lle, mutta sinulla ei ole sellaista", + ["gave_account_money"] = "Sinä annoit $%s (%s) henkilölle %s", + ["received_account_money"] = "Sinä sait $%s (%s) henkilöltä %s", + ["amount_invalid"] = "Virheellinen määrä", + ["players_nearby"] = "Ei pelaajia lähettyvillä", + ["ex_inv_lim"] = "Toiminto mahdoton, reppu alkaa olla täysi %s", + ["imp_invalid_quantity"] = "Toiminto mahdoton, virheellinen määrä", + ["imp_invalid_amount"] = "Toiminto mahdoton, virhellinen summa", + ["threw_standard"] = "Sinä heitit %sx %s", + ["threw_account"] = "Sinä heitit $%s %s", + ["threw_weapon"] = "Sinä heitit 1x %s", + ["threw_weapon_ammo"] = "Heitit 1x %s ammuksella ~o~%sx %s", + ["threw_weapon_already"] = "Sinulla on jo sama ase", + ["threw_cannot_pickup"] = "Et voi kerätä sitä, koska reppusi on täynnä", + ["threw_pickup_prompt"] = "Paina E kerätäksesi", -- Key mapping - ["keymap_showinventory"] = "show Inventory", + ["keymap_showinventory"] = "Avaa reppu", -- Salary related - ["received_salary"] = "sinä vastaanotit palkkaa: $%s", - ["received_help"] = "sinä vastaanotit valtion tukea: $%s", - ["company_nomoney"] = "yritys jolle teet töitä on köyhä eikä voi maksaa palkkaasi", - ["received_paycheck"] = "sait palkan", - ["bank"] = "pankki", - ["account_bank"] = "bank", - ["account_black_money"] = "dirty Money", - ["account_money"] = "cash", + ["received_salary"] = "Vastaanotit palkkaa: $%s", + ["received_help"] = "Vastaanotit valtion tukea: $%s", + ["company_nomoney"] = "Yrityksellä jolle teet töitä ei ole varaa maksaa palkkaasi", + ["received_paycheck"] = "Sait palkan", + ["bank"] = "Pankki", + ["account_bank"] = "Pankki", + ["account_black_money"] = "Likainen raha", + ["account_money"] = "Käteinen", - ["act_imp"] = "toiminto mahdoton", - ["in_vehicle"] = "et voi antaa ajoneuvossa olevalle mitään", + ["act_imp"] = "Toiminto mahdoton", + ["in_vehicle"] = "Et voi antaa ajoneuvossa olevalle mitään", + ["not_in_vehicle"] = "Toimintoa ei voida suorittaa, pelaaja ei ole ajoneuvossa", -- Commands - ["command_car"] = "spawn an vehicle", - ["command_car_car"] = "vehicle spawn name or hash", - ["command_cardel"] = "delete vehicle in proximity", - ["command_cardel_radius"] = "optional, delete every vehicle within the specified radius", - ["command_clear"] = "clear chat", - ["command_clearall"] = "clear chat for all players", - ["command_clearinventory"] = "clear player inventory", - ["command_clearloadout"] = "clear a player loadout", - ["command_giveaccountmoney"] = "give account money", - ["command_giveaccountmoney_account"] = "valid account name", - ["command_giveaccountmoney_amount"] = "amount to add", - ["command_giveaccountmoney_invalid"] = "invalid account name", - ["command_giveitem"] = "give an item to a player", - ["command_giveitem_item"] = "item name", - ["command_giveitem_count"] = "item count", - ["command_giveweapon"] = "give a weapon to a player", - ["command_giveweapon_weapon"] = "weapon name", - ["command_giveweapon_ammo"] = "ammo count", - ["command_giveweapon_hasalready"] = "player already has that weapon", - ["command_giveweaponcomponent"] = "give weapon component", - ["command_giveweaponcomponent_component"] = "component name", - ["command_giveweaponcomponent_invalid"] = "invalid weapon component", - ["command_giveweaponcomponent_hasalready"] = "player already has that weapon component", - ["command_giveweaponcomponent_missingweapon"] = "player does not have that weapon", - ["command_save"] = "save a player to database", - ["command_saveall"] = "save all players to database", - ["command_setaccountmoney"] = "set account money for a player", - ["command_setaccountmoney_amount"] = "amount of money to set", - ["command_setcoords"] = "teleport to coordinates", - ["command_setcoords_x"] = "x axis", - ["command_setcoords_y"] = "y axis", - ["command_setcoords_z"] = "z axis", - ["command_setjob"] = "set job for a player", - ["command_setjob_job"] = "job name", - ["command_setjob_grade"] = "job grade", - ["command_setjob_invalid"] = "the job, grade or both are invalid", - ["command_setgroup"] = "set player group", - ["command_setgroup_group"] = "group name", - ["commanderror_argumentmismatch"] = "argument count mismatch (passed %s, wanted %s)", - ["commanderror_argumentmismatch_number"] = "argument #%s type mismatch (passed string, wanted number)", - ["commanderror_invaliditem"] = "invalid item name", - ["commanderror_invalidweapon"] = "invalid weapon", - ["commanderror_console"] = "that command can not be run from console", - ["commanderror_invalidcommand"] = "/%s is not an valid command!", - ["commanderror_invalidplayerid"] = "there is no player online matching that server id", - ["commandgeneric_playerid"] = "player id", + ["command_car"] = "Luo ajoneuvo", + ["command_car_car"] = "Ajoneuvon nimi tai hash", + ["command_cardel"] = "Poistaa ajoneuvon läheltä", + ["command_cardel_radius"] = "Valinnainen, poista kaikki ajoneuvot määritetyllä säteellä", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", + ["command_clear"] = "Tyhjennä keskustelu", + ["command_clearall"] = "Tyhjennä keskustelu kaikilta pelaajilta", + ["command_clearinventory"] = "Tyhjennä pelaajan reppu", + ["command_clearloadout"] = "Tyhjennä pelaajan varustus", + ["command_giveaccountmoney"] = "Anna tilirahaa", + ["command_giveaccountmoney_account"] = "Kelvollinen tilin nimi", + ["command_giveaccountmoney_amount"] = "Lisättävä määrä", + ["command_giveaccountmoney_invalid"] = "Virheellinen tili nimi", + ["command_giveitem"] = "Anna pelaajalle esine", + ["command_giveitem_item"] = "Esineen nimi", + ["command_giveitem_count"] = "Esineiden määrä", + ["command_giveweapon"] = "Anna pelaajalle ase", + ["command_giveweapon_weapon"] = "Aseen nimi", + ["command_giveweapon_ammo"] = "Ammusten määrä", + ["command_giveweapon_hasalready"] = "Pelaajalla on jo kyseinen ase", + ["command_giveweaponcomponent"] = "Anna aseen komponentti", + ["command_giveweaponcomponent_component"] = "Komponentin nimi", + ["command_giveweaponcomponent_invalid"] = "Virheellinen aseen komponentti", + ["command_giveweaponcomponent_hasalready"] = "Pelaajalla on jo kyseinen asekomponentti", + ["command_giveweaponcomponent_missingweapon"] = "Pelaajalla ei ole kyseistä asetta", + ["command_save"] = "Talenna pelaaja tietokantaan", + ["command_saveall"] = "Tallenna kaikki pelaajat tietokantaan", + ["command_setaccountmoney"] = "Aseta tilirahaa pelaajalle", + ["command_setaccountmoney_amount"] = "Asetettava rahamäärä", + ["command_setcoords"] = "Teleporttaa koordinaatteihin", + ["command_setcoords_x"] = "x akseli", + ["command_setcoords_y"] = "y akseli", + ["command_setcoords_z"] = "z akseli", + ["command_setjob"] = "Aseta pelaajalle ammatti", + ["command_setjob_job"] = "Ammatti", + ["command_setjob_grade"] = "Arvo", + ["command_setjob_invalid"] = "Ammatti ja arvo tai molemmat ovat virheellisiä", + ["command_setgroup"] = "Aseta pelaajan ryhmä", + ["command_setgroup_group"] = "Ryhmän nimi", + ["commanderror_argumentmismatch"] = "Argumenttien määrä ei täsmää (hyväksytty %s, haluttu %s)", + ["commanderror_argumentmismatch_number"] = "Argumentin #%s tyyppi ei täsmää (syötetty merkkijono, haluttu numero)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Virheellinen esineen nimi", + ["commanderror_invalidweapon"] = "Virheellinen ase", + ["commanderror_console"] = "Komentoa ei voi suorittaa konsolissa", + ["commanderror_invalidcommand"] = "/%s ei ole kelvollinen komento!", + ["commanderror_invalidplayerid"] = "Palvelimella ei ole pelaajaa, joka vastaa annetua ID", + ["commandgeneric_playerid"] = "Pelaajan ID", + ["command_giveammo_noweapon_found"] = "%s ei ole sitä asetta", + ["command_giveammo_weapon"] = "Aseen nimi", + ["command_giveammo_ammo"] = "Ammusten määrä", -- Locale settings - ["locale_digit_grouping_symbol"] = " ", - ["locale_currency"] = "$%s", + ["locale_digit_grouping_symbol"] = "", + ["locale_currency"] = "€%s", + + -- Drug Wars DLC + ["weapon_candycane"] = "Karkkitanko", + ["weapon_acidpackage"] = "Happo pakkaus", + ["weapon_pistolxm3"] = "WM 29 Pistooli", + ["weapon_railgunxm3"] = "Raidetykki", -- Weapons - ["weapon_knife"] = "veitsi", - ["weapon_nightstick"] = "pamppu", - ["weapon_hammer"] = "vasara", - ["weapon_bat"] = "pesäpallomaila", - ["weapon_golfclub"] = "golf maila", - ["weapon_crowbar"] = "sorkkarauta", - ["weapon_pistol"] = "pistooli", - ["weapon_combatpistol"] = "taistelu pistooli", - ["weapon_appistol"] = "automaatti pistooli", + ["weapon_knife"] = "Veitsi", + ["weapon_nightstick"] = "Pamppu", + ["weapon_hammer"] = "Vasara", + ["weapon_bat"] = "Pesäpallomaila", + ["weapon_golfclub"] = "Golf maila", + ["weapon_crowbar"] = "Sorkkarauta", + ["weapon_pistol"] = "Pistooli", + ["weapon_combatpistol"] = "Taistelu pistooli", + ["weapon_appistol"] = "Automaatti pistooli", ["weapon_pistol50"] = "50 kaliiperinen pistooli", - ["weapon_microsmg"] = "mikro konepistooli", - ["weapon_smg"] = "konepistooli", - ["weapon_assaultsmg"] = "rynnäkkö konepistooli", - ["weapon_assaultrifle"] = "rynnäkkökivääri", - ["weapon_carbinerifle"] = "karbiini kivääri", - ["weapon_advancedrifle"] = "edistynyt kivääri", - ["weapon_mg"] = "konekivääri", - ["weapon_combatmg"] = "rynnäkkö konekivääri", - ["weapon_pumpshotgun"] = "pumppu haulikko", - ["weapon_sawnoffshotgun"] = "katkaistuhaulikko", - ["weapon_assaultshotgun"] = "hyökkäyshaulikko", - ["weapon_bullpupshotgun"] = "bullpup haulikko", - ["weapon_stungun"] = "tainutusase", - ["weapon_sniperrifle"] = "tarkkuuskivääri", - ["weapon_heavysniper"] = "raskas tarkkuuskivääri", - ["weapon_grenadelauncher"] = "kranaatinheitin", - ["weapon_rpg"] = "raketinheitin", - ["weapon_minigun"] = "minigun", - ["weapon_grenade"] = "kranaatti", - ["weapon_stickybomb"] = "tahma pommi", - ["weapon_smokegrenade"] = "savu kranaatti", - ["weapon_bzgas"] = "bz-kaasu", - ["weapon_molotov"] = "polttopullo", - ["weapon_fireextinguisher"] = "palosammutin", - ["weapon_petrolcan"] = "jerrykannu", - ["weapon_ball"] = "pallo", - ["weapon_snspistol"] = "pienpistooli", - ["weapon_bottle"] = "pullo", - ["weapon_gusenberg"] = "tommy gun", + ["weapon_microsmg"] = "Mikro konepistooli", + ["weapon_smg"] = "Konepistooli", + ["weapon_assaultsmg"] = "Rynnäkkö konepistooli", + ["weapon_assaultrifle"] = "Rynnäkkökivääri", + ["weapon_carbinerifle"] = "Karbiini kivääri", + ["weapon_advancedrifle"] = "Edistynyt kivääri", + ["weapon_mg"] = "Konekivääri", + ["weapon_combatmg"] = "Rynnäkkö konekivääri", + ["weapon_pumpshotgun"] = "Pumppu haulikko", + ["weapon_sawnoffshotgun"] = "Katkaistuhaulikko", + ["weapon_assaultshotgun"] = "Hyökkäyshaulikko", + ["weapon_bullpupshotgun"] = "Bullpup haulikko", + ["weapon_stungun"] = "Tainutusase", + ["weapon_sniperrifle"] = "Tarkkuuskivääri", + ["weapon_heavysniper"] = "Raskas tarkkuuskivääri", + ["weapon_grenadelauncher"] = "Kranaatinheitin", + ["weapon_rpg"] = "Raketinheitin", + ["weapon_minigun"] = "Minigun", + ["weapon_grenade"] = "Kranaatti", + ["weapon_stickybomb"] = "Tahma pommi", + ["weapon_smokegrenade"] = "Savukranaatti", + ["weapon_bzgas"] = "Bz-kaasu", + ["weapon_molotov"] = "Polttopullo", + ["weapon_fireextinguisher"] = "Palosammutin", + ["weapon_petrolcan"] = "Jerrykannu", + ["weapon_ball"] = "Pallo", + ["weapon_snspistol"] = "Pienpistooli", + ["weapon_bottle"] = "Pullo", + ["weapon_gusenberg"] = "Thompson-konepistooli", ["weapon_specialcarbine"] = "G86C", - ["weapon_heavypistol"] = "raskas pistooli", - ["weapon_bullpuprifle"] = "bullpup kivääri", - ["weapon_dagger"] = "tikari", - ["weapon_vintagepistol"] = "vanha pistooli", - ["weapon_firework"] = "ilotulitus", - ["weapon_musket"] = "musketti", - ["weapon_heavyshotgun"] = "raskas haulikko", - ["weapon_marksmanrifle"] = "marksman kivääri", - ["weapon_hominglauncher"] = "ohjautuva raketinheitin", - ["weapon_proxmine"] = "lähellä räjähtävä miina", - ["weapon_snowball"] = "lumipallo", - ["weapon_flaregun"] = "valopyssy", - ["weapon_combatpdw"] = "rynnäkkö pdw", - ["weapon_marksmanpistol"] = "marksman pistooli", - ["weapon_knuckle"] = "nyrkkirauta", - ["weapon_hatchet"] = "kirves", - ["weapon_railgun"] = "raidetykki", - ["weapon_machete"] = "viidakkoveitsi", - ["weapon_machinepistol"] = "konepistooli", - ["weapon_switchblade"] = "stiletti", - ["weapon_revolver"] = "raskas revolveri", - ["weapon_dbshotgun"] = "kakspiippunen haulikko", - ["weapon_compactrifle"] = "pikku AK", - ["weapon_autoshotgun"] = "automaattinen haulikko", + ["weapon_heavypistol"] = "Raskas pistooli", + ["weapon_bullpuprifle"] = "Bullpup kivääri", + ["weapon_dagger"] = "Tikari", + ["weapon_vintagepistol"] = "Vanha pistooli", + ["weapon_firework"] = "Ilotulite", + ["weapon_musket"] = "Musketti", + ["weapon_heavyshotgun"] = "Raskas haulikko", + ["weapon_marksmanrifle"] = "Marksman kivääri", + ["weapon_hominglauncher"] = "Ohjautuva raketinheitin", + ["weapon_proxmine"] = "Lähellä räjähtävä miina", + ["weapon_snowball"] = "Lumipallo", + ["weapon_flaregun"] = "Valopistooli", + ["weapon_combatpdw"] = "Rynnäkkö pdw", + ["weapon_marksmanpistol"] = "Marksman pistooli", + ["weapon_knuckle"] = "Nyrkkirauta", + ["weapon_hatchet"] = "Kirves", + ["weapon_railgun"] = "Raidetykki", + ["weapon_machete"] = "Viidakkoveitsi", + ["weapon_machinepistol"] = "Konepistooli", + ["weapon_switchblade"] = "Stiletti", + ["weapon_revolver"] = "Raskas revolveri", + ["weapon_dbshotgun"] = "Kaksipiippunen haulikko", + ["weapon_compactrifle"] = "Pikku AK", + ["weapon_autoshotgun"] = "Automaattinen haulikko", ["weapon_battleaxe"] = "Taistelukirves", - ["weapon_compactlauncher"] = "pien kranaatinheitin", - ["weapon_minismg"] = "mini konepistooli", - ["weapon_pipebomb"] = "putkipommi", - ["weapon_poolcue"] = "biljardimaila", - ["weapon_wrench"] = "putkipihdit", - ["weapon_flashlight"] = "taskulamppu", - ["gadget_parachute"] = "laskuvarjo", - ["weapon_flare"] = "hätäraketti", - ["weapon_doubleaction"] = "double-Action Revolver", + ["weapon_compactlauncher"] = "Pien kranaatinheitin", + ["weapon_minismg"] = "Mini konepistooli", + ["weapon_pipebomb"] = "Putkipommi", + ["weapon_poolcue"] = "Biljardimaila", + ["weapon_wrench"] = "Putkipihdit", + ["weapon_flashlight"] = "Taskulamppu", + ["gadget_parachute"] = "Laskuvarjo", + ["weapon_flare"] = "Hätäraketti", + ["weapon_doubleaction"] = "Double action revolveri", + ["weapon_heavyrifle"] = "Raskas kivääri", -- Weapon Components - ["component_clip_default"] = "default Clip", - ["component_clip_extended"] = "extended Clip", - ["component_clip_drum"] = "drum Magazine", - ["component_clip_box"] = "box Magazine", - ["component_flashlight"] = "flashlight", - ["component_scope"] = "scope", - ["component_scope_advanced"] = "advanced Scope", - ["component_suppressor"] = "suppressor", - ["component_grip"] = "grip", - ["component_luxary_finish"] = "luxary Weapon Finish", + ["component_clip_default"] = "Oletus lipas", + ["component_clip_extended"] = "Paranneltu lipas", + ["component_clip_drum"] = "Rumpulipas", + ["component_clip_box"] = "Laatikkolipas", + ["component_flashlight"] = "Taskulamppu", + ["component_scope"] = "Tähtäin", + ["component_scope_advanced"] = "Paranneltu tähtäin", + ["component_suppressor"] = "Äänenvaimennin", + ["component_grip"] = "Kahva", + ["component_luxary_finish"] = "Luksus ulkokuori", -- Weapon Ammo - ["ammo_rounds"] = "round(s)", - ["ammo_shells"] = "shell(s)", - ["ammo_charge"] = "charge", - ["ammo_petrol"] = "gallons of fuel", - ["ammo_firework"] = "firework(s)", - ["ammo_rockets"] = "rocket(s)", - ["ammo_grenadelauncher"] = "grenade(s)", - ["ammo_grenade"] = "grenade(s)", - ["ammo_stickybomb"] = "bomb(s)", - ["ammo_pipebomb"] = "bomb(s)", - ["ammo_smokebomb"] = "bomb(s)", - ["ammo_molotov"] = "cocktail(s)", - ["ammo_proxmine"] = "mine(s)", - ["ammo_bzgas"] = "can(s)", - ["ammo_ball"] = "ball(s)", - ["ammo_snowball"] = "snowball(s)", - ["ammo_flare"] = "flare(s)", - ["ammo_flaregun"] = "flare(s)", + ["ammo_rounds"] = "Ammukset(s)", + ["ammo_shells"] = "Hylsy(s)", + ["ammo_charge"] = "Lataa", + ["ammo_petrol"] = "Gallonaa polttoainetta", + ["ammo_firework"] = "Ilotulite(s)", + ["ammo_rockets"] = "Raketti(s)", + ["ammo_grenadelauncher"] = "Kranaatti(s)", + ["ammo_grenade"] = "Kranaatti(s)", + ["ammo_stickybomb"] = "Pommi(s)", + ["ammo_pipebomb"] = "Pommi(s)", + ["ammo_smokebomb"] = "Pommi(s)", + ["ammo_molotov"] = "Polttopullo(s)", + ["ammo_proxmine"] = "Miina(s)", + ["ammo_bzgas"] = "Tölkki(s)", + ["ammo_ball"] = "Pallo(s)", + ["ammo_snowball"] = "Lumipallo(s)", + ["ammo_flare"] = "Valoraketti(s)", + ["ammo_flaregun"] = "Valoraketti(s)", -- Weapon Tints - ["tint_default"] = "default skin", - ["tint_green"] = "green skin", - ["tint_gold"] = "gold skin", - ["tint_pink"] = "pink skin", - ["tint_army"] = "army skin", - ["tint_lspd"] = "blue skin", - ["tint_orange"] = "orange skin", - ["tint_platinum"] = "platinum skin", + ["tint_default"] = "Oletus ulkokuori", + ["tint_green"] = "Vihreä ulkokuori", + ["tint_gold"] = "Kultainen ulkokuori", + ["tint_pink"] = "Vaaleanpunainen ulkokuori", + ["tint_army"] = "Armeija ulkokuori", + ["tint_lspd"] = "Sininen ulkokuori", + ["tint_orange"] = "Oranssi ulkokuori", + ["tint_platinum"] = "Platina ulkokuori", } diff --git a/server-data/resources/[esx]/es_extended/locales/fr.lua b/server-data/resources/[esx]/es_extended/locales/fr.lua index a5dd3d398..3dedf7928 100644 --- a/server-data/resources/[esx]/es_extended/locales/fr.lua +++ b/server-data/resources/[esx]/es_extended/locales/fr.lua @@ -1,210 +1,373 @@ Locales["fr"] = { -- Inventory - ["giveammo"] = "donner munitions", - ["amountammo"] = "nombre de munitions", - ["noammo"] = "tu n'as pas toutes ces munitions!", - ["gave_item"] = "vous avez donné %sx %s à %s", - ["received_item"] = "vous avez reçu %sx %s par %s", - ["gave_weapon"] = "vous avez donné 1x %s à %s", - ["gave_weapon_ammo"] = "vous avez donné ~o~%sx %s pour %s à %s", - ["gave_weapon_withammo"] = "vous avez donné 1x %s avec ~o~%sx %s à %s", - ["gave_weapon_hasalready"] = "%s a déjà %s", + ["inventory"] = "Inventaire ( Poids %s / %s )", + ["use"] = "Utiliser", + ["give"] = "Donner", + ["remove"] = "Jeter", + ["return"] = "Retour", + ["give_to"] = "Donner à", + ["amount"] = "Quantité", + ["giveammo"] = "Donner des munitions", + ["amountammo"] = "Nombre de munitions", + ["noammo"] = "Vous n'avez pas autant de munitions!", + ["gave_item"] = "Vous avez donné %sx %s à %s", + ["received_item"] = "Vous avez reçu %sx %s de %s", + ["gave_weapon"] = "Vous avez donné 1x %s à %s", + ["gave_weapon_ammo"] = "Vous avez donné ~o~%sx %s pour %s à %s", + ["gave_weapon_withammo"] = "Vous avez donné 1x %s avec ~o~%sx %s à %s", + ["gave_weapon_hasalready"] = "%s a déjà 1x %s", ["gave_weapon_noweapon"] = "%s n'a pas cette arme", - ["received_weapon"] = "vous recevez 1x %s de %s", - ["received_weapon_ammo"] = "vous avez reçu ~o~%sx %s pour votre %s de %s", - ["received_weapon_withammo"] = "vous avez reçu 1x %s avec ~o~%sx %s de %s", - ["received_weapon_hasalready"] = "%s a tenté de vous donner %s, mais vous en aviez déjà un exemplaire", - ["received_weapon_noweapon"] = "%s tente de vous donner des munitions pour %s, mais vous n'en avez pas", - ["gave_account_money"] = "vous avez donné $%s (%s) à %s", - ["received_account_money"] = "vous avez reçu $%s (%s) par %s", - ["amount_invalid"] = "montant invalide", - ["players_nearby"] = "aucun joueur à proximité", - ["ex_inv_lim"] = "action impossible, depassement de la limite d'inventaire pour %s", - ["imp_invalid_quantity"] = "action impossible, ~r~quantité invalide", - ["imp_invalid_amount"] = "action impossible, ~r~montant invalide", - ["threw_standard"] = "vous avez jeté %sx %s", - ["threw_account"] = "vous avez jeté $%s %s", - ["threw_weapon"] = "vous avez jeté 1x %s", - ["threw_weapon_ammo"] = "vous avez jeté 1x %s avec ~o~%sx %s", - ["threw_weapon_already"] = "vous portez déjà cette arme", - ["threw_cannot_pickup"] = "vous ne pouvez pas ramasser ça votre inventaire est plein !", - ["threw_pickup_prompt"] = "appuyez sur E pour ramasser", + ["received_weapon"] = "Vous avez reçu 1x %s de %s", + ["received_weapon_ammo"] = "Vous avez reçu ~o~%sx %s pour votre %s de %s", + ["received_weapon_withammo"] = "Vous avez reçu 1x %s avec ~o~%sx %s de %s", + ["received_weapon_hasalready"] = "%s a tenté de vous donner 1x %s, mais vous en aviez déjà un exemplaire", + ["received_weapon_noweapon"] = "%s a tenté de vous donner des munitions pour %s, mais vous n'avez pas cette arme", + ["gave_account_money"] = "Vous avez donné $%s (%s) à %s", + ["received_account_money"] = "Vous avez reçu $%s (%s) de %s", + ["amount_invalid"] = "Le montant est invalide", + ["players_nearby"] = "Aucun joueur n'est à proximité", + ["ex_inv_lim"] = "Action impossible, dépassement du poids maximum de %s", + ["imp_invalid_quantity"] = "Action impossible, la quantité est invalide", + ["imp_invalid_amount"] = "Action impossible, le montant est invalide", + ["threw_standard"] = "Vous avez jeté %sx %s", + ["threw_account"] = "Vous avez jeté $%s %s", + ["threw_weapon"] = "Vous avez jeté 1x %s", + ["threw_weapon_ammo"] = "Vous avez jeté 1x %s avec ~o~%sx %s", + ["threw_weapon_already"] = "Vous avez déjà cette arme", + ["threw_cannot_pickup"] = "Votre inventaire est plein, vous ne pouvez donc pas ramasser cela!", + ["threw_pickup_prompt"] = "Appuyez sur E pour ramasser", -- Key mapping - ["keymap_showinventory"] = "montrer l'inventaire", + ["keymap_showinventory"] = "Afficher l'inventaire", -- Salary related - ["received_salary"] = "vous avez reçu votre salaire: $%s", - ["received_help"] = "vous avez reçu une aide de l'état: $%s", - ["company_nomoney"] = "votre entreprise n'a plus d'argent pour vous payer!", - ["received_paycheck"] = "paiement reçu", - ["bank"] = "banque", - ["account_bank"] = "banque", - ["account_black_money"] = "argent sale", - ["account_money"] = "espèces", - - ["act_imp"] = "action impossible", - ["in_vehicle"] = "Vous ne pouvez rien donner à quelqu'un dans un véhicule", + ["received_salary"] = "Vous avez reçu votre salaire: $%s", + ["received_help"] = "Vous avez reçu une aide de l'état: $%s", + ["company_nomoney"] = "Votre entreprise n'a pas assez d'argent pour vous payer", + ["received_paycheck"] = "Paiement reçu", + ["bank"] = "Banque", + ["account_bank"] = "Banque", + ["account_black_money"] = "Argent sale", + ["account_money"] = "Espèces", + + ["act_imp"] = "Action impossible", + ["in_vehicle"] = "Action impossible, le joueur est dans un véhicule", + ["not_in_vehicle"] = "Action impossible, le joueur n'est pas dans un véhicule", -- Commands - ["command_car"] = "faire appaitre un véhicule", - ["command_car_car"] = "nom ou hash du véhicule", - ["command_cardel"] = "supprimer le véhicule à proximité", - ["command_cardel_radius"] = "optionnel, supprime les véhicules dans un rayon spécifié", - ["command_clear"] = "vider le chat", - ["command_clearall"] = "vider le chat pour tous", - ["command_clearinventory"] = "vider l'inventaire d'un joueur", - ["command_clearloadout"] = "vider le loadout d'un joueur", - ["command_giveaccountmoney"] = "donner de l'argent sur un compte", - ["command_giveaccountmoney_account"] = "nom de compte valide", - ["command_giveaccountmoney_amount"] = "quantité à ajouter", - ["command_giveaccountmoney_invalid"] = "nom de compte invalide", - ["command_giveitem"] = "donner un objet à un joueur", - ["command_giveitem_item"] = "nom de l'objet", - ["command_giveitem_count"] = "quantité de l'objet", - ["command_giveweapon"] = "donner une arme à un joueur", - ["command_giveweapon_weapon"] = "nom de l'arme", - ["command_giveweapon_ammo"] = "quantité de munitions", - ["command_giveweapon_hasalready"] = "le joueur a déjà cette arme", - ["command_giveweaponcomponent"] = "donner un accessoire d'arme", - ["command_giveweaponcomponent_component"] = "nom de l'accessoire", - ["command_giveweaponcomponent_invalid"] = "accessoire invalide", - ["command_giveweaponcomponent_hasalready"] = "le joueur a déjà cet accessoire", - ["command_giveweaponcomponent_missingweapon"] = "le joueur n'a pas cette arme", - ["command_save"] = "sauvegarder un joueur dans la base de données", - ["command_saveall"] = "sauvegarder tous les joueurs dans la base de données", - ["command_setaccountmoney"] = "définir la somme d'argent pour un joueur", - ["command_setaccountmoney_amount"] = "quantité d'argent à définir", - ["command_setcoords"] = "se téléporter aux coordonnées", - ["command_setcoords_x"] = "axe X", - ["command_setcoords_y"] = "axe Y", - ["command_setcoords_z"] = "axe Z", - ["command_setjob"] = "assigner job à un joueur", - ["command_setjob_job"] = "nom du job", - ["command_setjob_grade"] = "grade du job", - ["command_setjob_invalid"] = "le job, le grade ou les deux sont invalides", - ["command_setgroup"] = "assigner un groupe à un joueur", - ["command_setgroup_group"] = "nom du groupe", - ["commanderror_argumentmismatch"] = "argument count mismatch (passed %s, wanted %s)", - ["commanderror_argumentmismatch_number"] = "argument #%s type mismatch (passed string, wanted number)", - ["commanderror_invaliditem"] = "nom de l'objet invalide", - ["commanderror_invalidweapon"] = "arme invalide", - ["commanderror_console"] = "cette commande ne peut pas être utilisée dans la console", - ["commanderror_invalidcommand"] = "/%s n'est pas une commande valide!", - ["commanderror_invalidplayerid"] = "il n'ya aucun joueur avec cet ID en jeu", - ["commandgeneric_playerid"] = "id joueur", + ["command_bring"] = "Téléporter un joueur sur vous", + ["command_car"] = "Faire appaitre un véhicule", + ["command_car_car"] = "Nom ou hash du véhicule", + ["command_cardel"] = "Supprimer les véhicules à proximité", + ["command_cardel_radius"] = "Supprime tous les véhicules dans un rayon spécifié", + ["command_repair"] = "Réparer votre véhicule", + ["command_repair_success"] = "Véhicule réparé avec succès", + ["command_repair_success_target"] = "Votre véhicule a été réparé par un membre du staff", + ["command_clear"] = "Effacer le chat", + ["command_clearall"] = "Effacer le chat de tous les joueurs", + ["command_clearinventory"] = "Retirer tous les objets de l'inventaire du joueur", + ["command_clearloadout"] = "Retirer toutes les armes du joueur", + ["command_freeze"] = "Geler un joueur sur place", + ["command_unfreeze"] = "Dégeler un joueur", + ["command_giveaccountmoney"] = "Donner de l'argent à un compte spécifique", + ["command_giveaccountmoney_account"] = "Compte à créditer", + ["command_giveaccountmoney_amount"] = "Quantité d'argent à créditer", + ["command_giveaccountmoney_invalid"] = "Le nom de compte spécifié est invalide", + ["command_removeaccountmoney"] = "Retirer de l'argent d'un compte spécifique", + ["command_removeaccountmoney_account"] = "Compte à débiter", + ["command_removeaccountmoney_amount"] = "Quantité d'argent à débiter", + ["command_removeaccountmoney_invalid"] = "Le nom de compte spécifié est invalide", + ["command_giveitem"] = "Donner un objet à un joueur", + ["command_giveitem_item"] = "Nom de l'objet à donner", + ["command_giveitem_count"] = "Quantité à donner", + ["command_giveweapon"] = "Donner une arme à un joueur", + ["command_giveweapon_weapon"] = "Nom de l'arme à donner", + ["command_giveweapon_ammo"] = "Quantité de munitions à donner", + ["command_giveweapon_hasalready"] = "Le joueur a déjà cette arme", + ["command_giveweaponcomponent"] = "Donner un accessoire d'arme à un joueur", + ["command_giveweaponcomponent_component"] = "Nom de l'accessoire à donner", + ["command_giveweaponcomponent_invalid"] = "Le nom de l'accessoire d'arme spécifié est invalide", + ["command_giveweaponcomponent_hasalready"] = "Le joueur a déjà cet accessoire", + ["command_giveweaponcomponent_missingweapon"] = "Le joueur n'a pas l'arme associée à cet accessoire", + ["command_goto"] = "Se téléporter vers un joueur", + ["command_kill"] = "Tuer un joueur", + ["command_save"] = "Forcer la sauvegarde des données d'un joueur", + ["command_saveall"] = "Forcer la sauvegarde des données de tous les joueurs", + ["command_setaccountmoney"] = "Définir le montant d'argent d'un compte spécifique", + ["command_setaccountmoney_amount"] = "Montant d'argent à définir", + ["command_setcoords"] = "Se téléporter à des coordonnées spécifiques", + ["command_setcoords_x"] = "Valeur de l'axe X", + ["command_setcoords_y"] = "Valeur de l'axe Y", + ["command_setcoords_z"] = "Valeur de l'axe Z", + ["command_setjob"] = "Définir le métier d'un joueur", + ["command_setjob_job"] = "Nom du métier à définir", + ["command_setjob_grade"] = "Grade du métier", + ["command_setjob_invalid"] = "Le métier, le grade, ou les deux sont invalides", + ["command_setgroup"] = "Définir le groupe de permissions d'un joueur", + ["command_setgroup_group"] = "Nom du groupe à définir", + ["commanderror_argumentmismatch"] = "Le nombre d'arguments est invalide (Argument·s donné·s: %s, Argument·s demandé·s: %s)", + ["commanderror_argumentmismatch_number"] = "Type de données de l'argument #%s invalide (Type donné: texte, Type demandé: nombre)", + ["commanderror_argumentmismatch_string"] = "Type de données de l'argument #%s invalide (Type donné: nombre, Type demandé: texte)", + ["commanderror_invaliditem"] = "Le nom de l'objet est invalide", + ["commanderror_invalidweapon"] = "Le nom de l'arme est invalide", + ["commanderror_console"] = "Cette commande ne peut pas être éxécutée depuis la console", + ["commanderror_invalidcommand"] = "Commande invalide - /%s", + ["commanderror_invalidplayerid"] = "Le joueur spécifié n'est pas connecté", + ["commandgeneric_playerid"] = "Identifiant serveur du joueur", + ["command_giveammo_noweapon_found"] = "%s n'a pas cette arme", + ["command_giveammo_weapon"] = "Nom de l'arme", + ["command_giveammo_ammo"] = "Quantité de munitions", + ["tpm_nowaypoint"] = "Aucun point n'est défini sur la carte", + ["tpm_success"] = "Vous avez bien été téléporté", + + ["noclip_message"] = "Le mode noclip a été %s", + ["enabled"] = "~g~activé~s~", + ["disabled"] = "~r~désactivé~s~", -- Locale settings ["locale_digit_grouping_symbol"] = " ", ["locale_currency"] = "$%s", -- Weapons - ["weapon_knife"] = "couteau", - ["weapon_nightstick"] = "matraque", - ["weapon_hammer"] = "marteau", - ["weapon_bat"] = "batte", - ["weapon_golfclub"] = "club de golf", - ["weapon_crowbar"] = "pied de biche", - ["weapon_pistol"] = "pistolet", - ["weapon_combatpistol"] = "pistolet de combat", - ["weapon_appistol"] = "pistolet automatique", - ["weapon_pistol50"] = "pistolet calibre 50", - ["weapon_microsmg"] = "micro smg", - ["weapon_smg"] = "smg", - ["weapon_assaultsmg"] = "smg d'assaut", - ["weapon_assaultrifle"] = "fusil d'assaut", - ["weapon_carbinerifle"] = "carabine d'assaut", - ["weapon_advancedrifle"] = "fusil avancé", - ["weapon_mg"] = "mitrailleuse", - ["weapon_combatmg"] = "mitrailleuse de combat", - ["weapon_pumpshotgun"] = "fusil à pompe", - ["weapon_sawnoffshotgun"] = "carabine à canon scié", - ["weapon_assaultshotgun"] = "carabine d'assaut", - ["weapon_bullpupshotgun"] = "carabine bullpup", - ["weapon_stungun"] = "tazer", - ["weapon_sniperrifle"] = "fusil de sniper", - ["weapon_heavysniper"] = "fusil de sniper lourd", - ["weapon_grenadelauncher"] = "lance-grenade", - ["weapon_rpg"] = "lance-rocket", - ["weapon_minigun"] = "minigun", - ["weapon_grenade"] = "grenade", - ["weapon_stickybomb"] = "bombe collante", - ["weapon_smokegrenade"] = "grenade fumigène", - ["weapon_bzgas"] = "grenade à gaz bz", - ["weapon_molotov"] = "cocktail molotov", - ["weapon_fireextinguisher"] = "extincteur", - ["weapon_petrolcan"] = "jerrican d'essence", - ["weapon_ball"] = "balle", - ["weapon_snspistol"] = "pistolet sns", - ["weapon_bottle"] = "bouteille", - ["weapon_gusenberg"] = "balayeuse gusenberg", - ["weapon_specialcarbine"] = "carabine spéciale", - ["weapon_heavypistol"] = "pistolet lourd", - ["weapon_bullpuprifle"] = "fusil bullpup", - ["weapon_dagger"] = "poignard", - ["weapon_vintagepistol"] = "pistolet vintage", - ["weapon_firework"] = "feu d'artifice", - ["weapon_musket"] = "mousquet", - ["weapon_heavyshotgun"] = "fusil à pompe lourd", - ["weapon_marksmanrifle"] = "fusil marksman", - ["weapon_hominglauncher"] = "lance tête-chercheuse", - ["weapon_proxmine"] = "mine de proximité", - ["weapon_snowball"] = "boule de neige", - ["weapon_flaregun"] = "lance fusée de détresse", - ["weapon_combatpdw"] = "arme de défense personnelle", - ["weapon_marksmanpistol"] = "pistolet marksman", - ["weapon_knuckle"] = "poing américain", - ["weapon_hatchet"] = "hachette", - ["weapon_railgun"] = "canon éléctrique", - ["weapon_machete"] = "machette", - ["weapon_machinepistol"] = "pistolet mitrailleur", - ["weapon_switchblade"] = "couteau à cran d'arrêt", - ["weapon_revolver"] = "revolver", - ["weapon_dbshotgun"] = "fusil à pompe double canon", - ["weapon_compactrifle"] = "fusil compact", - ["weapon_autoshotgun"] = "fusil à pompe automatique", - ["weapon_battleaxe"] = "hache de combat", - ["weapon_compactlauncher"] = "lanceur compact", - ["weapon_minismg"] = "mini smg", - ["weapon_pipebomb"] = "bombe tuyau", - ["weapon_poolcue"] = "queue de billard", - ["weapon_wrench"] = "clé", - ["weapon_flashlight"] = "lampe torche", - ["gadget_parachute"] = "parachute", - ["weapon_flare"] = "fusée de détresse", - ["weapon_doubleaction"] = "revolver double action", + + -- Melee + ["weapon_dagger"] = "Dague", + ["weapon_bat"] = "Batte", + ["weapon_battleaxe"] = "Hache de combat", + ["weapon_bottle"] = "Bouteille", + ["weapon_crowbar"] = "Pied de biche", + ["weapon_flashlight"] = "Lampte torche", + ["weapon_golfclub"] = "Club de golf", + ["weapon_hammer"] = "Marteau", + ["weapon_hatchet"] = "Hachette", + ["weapon_knife"] = "Couteau", + ["weapon_knuckle"] = "Poing américain", + ["weapon_machete"] = "Machette", + ["weapon_nightstick"] = "Matraque", + ["weapon_wrench"] = "Clé à pipe", + ["weapon_poolcue"] = "Queue de billard", + ["weapon_stone_hatchet"] = "Hachette en pierre", + ["weapon_switchblade"] = "Couteau à cran d'arrêt", + + -- Handguns + ["weapon_appistol"] = "Pistolet automatique", + ["weapon_ceramicpistol"] = "Pistolet en céramique", + ["weapon_combatpistol"] = "Pistolet de combat", + ["weapon_doubleaction"] = "Revolver à double action", + ["weapon_navyrevolver"] = "Revolver de marine", + ["weapon_flaregun"] = "Pistolet de détresse", + ["weapon_gadgetpistol"] = "Pistolet gadget", + ["weapon_heavypistol"] = "Pistolet lourd", + ["weapon_revolver"] = "Revolver lourd", + ["weapon_revolver_mk2"] = "Revolver lourd MK2", + ["weapon_marksmanpistol"] = "Pistolet Marksman", + ["weapon_pistol"] = "Pistolet", + ["weapon_pistol_mk2"] = "Pistolet MK2", + ["weapon_pistol50"] = "Pistolet .50", + ["weapon_snspistol"] = "Pistolet SNS", + ["weapon_snspistol_mk2"] = "Pistolet SNS MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Atomiseur", + ["weapon_vintagepistol"] = "Pistolet vintage", + + -- Shotguns + ["weapon_assaultshotgun"] = "Fusil d'assaut", + ["weapon_autoshotgun"] = "Fusil à pompe automatique", + ["weapon_bullpupshotgun"] = "Fusil à pompe Bullpup", + ["weapon_combatshotgun"] = "Fusil de combat", + ["weapon_dbshotgun"] = "Fusil à pompe à double canon", + ["weapon_heavyshotgun"] = "Fusil à pompe lourd", + ["weapon_musket"] = "Mousquet", + ["weapon_pumpshotgun"] = "Fusil à pompe", + ["weapon_pumpshotgun_mk2"] = "Fusil à pompe MK2", + ["weapon_sawnoffshotgun"] = "Fusil à canon scié", + + -- SMG & LMG + ["weapon_assaultsmg"] = "SMG s'assaut", + ["weapon_combatmg"] = "MG de combat", + ["weapon_combatmg_mk2"] = "MG de combat MK2", + ["weapon_combatpdw"] = "PDW de combat", + ["weapon_gusenberg"] = "Balayeuse Gusenberg", + ["weapon_machinepistol"] = "Pistolet-mitrailleur", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Carabine à rayons", + + -- Rifles + ["weapon_advancedrifle"] = "Fusil avancé", + ["weapon_assaultrifle"] = "Fusil d'assaut", + ["weapon_assaultrifle_mk2"] = "Fusil d'assaut MK2", + ["weapon_bullpuprifle"] = "Fusil Bullpup", + ["weapon_bullpuprifle_mk2"] = "Fusil Bullpup MK2", + ["weapon_carbinerifle"] = "Fusil carabine", + ["weapon_carbinerifle_mk2"] = "Fusil carabine MK2", + ["weapon_compactrifle"] = "Fusil compacte", + ["weapon_militaryrifle"] = "Fusil militaire", + ["weapon_specialcarbine"] = "Carabine spéciale", + ["weapon_specialcarbine_mk2"] = "Carabine spéciale MK2", + ["weapon_heavyrifle"] = "Fusil lourd", + + -- Sniper + ["weapon_heavysniper"] = "Sniper lourd", + ["weapon_heavysniper_mk2"] = "Sniper lourd MK2", + ["weapon_marksmanrifle"] = "Fusil Marksman", + ["weapon_marksmanrifle_mk2"] = "Fusil Marksman MK2", + ["weapon_sniperrifle"] = "Fusil sniper", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Lanceur compacte", + ["weapon_firework"] = "Lanceur de feu d'artifice", + ["weapon_grenadelauncher"] = "Lanceur de grenade", + ["weapon_hominglauncher"] = "Lanceur de tête chercheuse", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Fusil à rail", + ["weapon_rpg"] = "Lanceur de rockette", + ["weapon_rayminigun"] = "Exterminateur", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Détecteur de métaux", + ["weapon_precisionrifle"] = "Fusil de précision", + ["weapon_tactilerifle"] = "Carabine tactique", + + -- Drug wars dlc + ["weapon_candycane"] = "Sucre d'orge", + ["weapon_acidpackage"] = "Paquet d'acide", + ["weapon_pistolxm3"] = "Pistolet 8 x3m", + ["weapon_railgunxm3"] = "Fusil électro-magnétique", + + -- Thrown + ["weapon_ball"] = "Base-ball", + ["weapon_bzgas"] = "Gaz BZ", + ["weapon_flare"] = "Fusée éclairante", + ["weapon_grenade"] = "Grenade", + ["weapon_petrolcan"] = "Jerrycan", + ["weapon_hazardcan"] = "Jerrycan dangereux", + ["weapon_molotov"] = "Cocktail Molotov", + ["weapon_proxmine"] = "Mine de proximité", + ["weapon_pipebomb"] = "Bombe tuyau", + ["weapon_snowball"] = "Boule de neige", + ["weapon_stickybomb"] = "Bombe collante", + ["weapon_smokegrenade"] = "Gaz lacrymogène", + + -- Special + ["weapon_fireextinguisher"] = "Extincteur", + ["weapon_digiscanner"] = "Scanner", + ["weapon_garbagebag"] = "Sac d'ordures", + ["weapon_handcuffs"] = "Menottes", + ["gadget_nightvision"] = "Vision nocturne", + ["gadget_parachute"] = "Parachute", -- Weapon Components - ["component_clip_default"] = "chargeur par défaut", - ["component_clip_extended"] = "chargeur grande capacité", - ["component_clip_drum"] = "chargeur tambour", - ["component_clip_box"] = "chargeur très grande capacité", - ["component_flashlight"] = "torche", - ["component_scope"] = "viseur", - ["component_scope_advanced"] = "lunette", - ["component_suppressor"] = "réducteur de son", + ["component_knuckle_base"] = "Modèle par défaut", + ["component_knuckle_pimp"] = "le Pimp", + ["component_knuckle_ballas"] = "le Ballas", + ["component_knuckle_dollar"] = "le Hustler", + ["component_knuckle_diamond"] = "le Rock", + ["component_knuckle_hate"] = "le Hater", + ["component_knuckle_love"] = "le Lover", + ["component_knuckle_player"] = "le Joueur", + ["component_knuckle_king"] = "le Roi", + ["component_knuckle_vagos"] = "le Vagos", + + ["component_luxary_finish"] = "Finition d'arme de luxe", + + ["component_handle_default"] = "Poignée par défaut", + ["component_handle_vip"] = "Poignée VIP", + ["component_handle_bodyguard"] = "Poignée bodyguard", + + ["component_vip_finish"] = "Finition VIP", + ["component_bodyguard_finish"] = "Finition bodyguard", + + ["component_camo_finish"] = "Camouflage numérique", + ["component_camo_finish2"] = "Camouflage pinceau", + ["component_camo_finish3"] = "Camouflage des bois", + ["component_camo_finish4"] = "Camouflage crâne", + ["component_camo_finish5"] = "Camouflage sessanta Nove", + ["component_camo_finish6"] = "Camouflage perseus", + ["component_camo_finish7"] = "Camouflage léopard", + ["component_camo_finish8"] = "Camouflage zèbre", + ["component_camo_finish9"] = "Camouflage géométrique", + ["component_camo_finish10"] = "Camouflage explosif", + ["component_camo_finish11"] = "Camouflage patriotique", + + ["component_camo_slide_finish"] = "Finitions slide à camouflage numérique", + ["component_camo_slide_finish2"] = "Finitions slide à camouflage pinceau", + ["component_camo_slide_finish3"] = "Finitions slide à camouflage des bois", + ["component_camo_slide_finish4"] = "Finitions slide à camouflage crâne", + ["component_camo_slide_finish5"] = "Finitions slide à camouflage sessanta Nove", + ["component_camo_slide_finish6"] = "Finitions slide à camouflage perseus", + ["component_camo_slide_finish7"] = "Finitions slide à camouflage léopard", + ["component_camo_slide_finish8"] = "Finitions slide à camouflage zèbre", + ["component_camo_slide_finish9"] = "Finitions slide à camouflage géométrique", + ["component_camo_slide_finish10"] = "Finitions slide à camouflage explosive", + ["component_camo_slide_finish11"] = "Finitions slide à camouflage patriotique", + + ["component_clip_default"] = "Chargeur par défaut", + ["component_clip_extended"] = "Chargeur à grande capacité", + ["component_clip_drum"] = "Chargeur à tambour", + ["component_clip_box"] = "Chargeur à très grande capacité", + + ["component_scope_holo"] = "Viseur holographique", + ["component_scope_small"] = "Viseur de petite taille", + ["component_scope_medium"] = "Viseur de taille moyenne", + ["component_scope_large"] = "Viseur de grande taille", + ["component_scope"] = "Viseur monté", + ["component_scope_advanced"] = "Viseur avancé", + ["component_ironsights"] = "Viseur à marqueurs alignés", + + ["component_suppressor"] = "silencieux", + ["component_compensator"] = "compensateur", + + ["component_muzzle_flat"] = "Frein plat", + ["component_muzzle_tactical"] = "Frein tactique", + ["component_muzzle_fat"] = "Frein large", + ["component_muzzle_precision"] = "Frein de précision", + ["component_muzzle_heavy"] = "Frein polyvalent", + ["component_muzzle_slanted"] = "Frein incliné", + ["component_muzzle_split"] = "Frein fendu", + ["component_muzzle_squared"] = "Frein carré", + + ["component_flashlight"] = "lampe torche", ["component_grip"] = "poignée", - ["component_luxary_finish"] = "finition de luxe", + + ["component_barrel_default"] = "Canon par défaut", + ["component_barrel_heavy"] = "Canon lourd", + + ["component_ammo_tracer"] = "Munition traceuse", + ["component_ammo_incendiary"] = "Munition incendiaire", + ["component_ammo_hollowpoint"] = "Munition à pointe creuse", + ["component_ammo_fmj"] = "Munition fMJ", + ["component_ammo_armor"] = "Munition perforante", + ["component_ammo_explosive"] = "Munition perforante et Munition incendiaire", + + ["component_shells_default"] = "Coque par défaut", + ["component_shells_incendiary"] = "Coque souffle de dragon", + ["component_shells_armor"] = "Coque à chevrotine en acier", + ["component_shells_hollowpoint"] = "Coque à fléchettes", + ["component_shells_explosive"] = "Coque à limaces explosives", -- Weapon Ammo ["ammo_rounds"] = "cartouche(s)", ["ammo_shells"] = "obus", - ["ammo_charge"] = "charge(s)", + ["ammo_charge"] = "charge·s", ["ammo_petrol"] = "jerrican d'essence", - ["ammo_firework"] = "feu(x) d'artifice", - ["ammo_rockets"] = "roquette(s)", - ["ammo_grenadelauncher"] = "grenade(s)", - ["ammo_grenade"] = "grenade(s)", - ["ammo_stickybomb"] = "bombe(s)", - ["ammo_pipebomb"] = "bombe(s)", - ["ammo_smokebomb"] = "bombe(s)", - ["ammo_molotov"] = "cocktail(s)", - ["ammo_proxmine"] = "mine(s)", - ["ammo_bzgas"] = "grenade(s)", - ["ammo_ball"] = "balle(s)", - ["ammo_snowball"] = "boule(s) de neige", - ["ammo_flare"] = "fusée(s) éclairante(s)", - ["ammo_flaregun"] = "fusée(s)", + ["ammo_firework"] = "feu·x d'artifice", + ["ammo_rockets"] = "roquette·s", + ["ammo_grenadelauncher"] = "grenade·s", + ["ammo_grenade"] = "grenade·s", + ["ammo_stickybomb"] = "bombe·s", + ["ammo_pipebomb"] = "bombe·s", + ["ammo_smokebomb"] = "bombe·s", + ["ammo_molotov"] = "cocktail·s", + ["ammo_proxmine"] = "mine·s", + ["ammo_bzgas"] = "grenade·s", + ["ammo_ball"] = "balle·s", + ["ammo_snowball"] = "boule·s de neige", + ["ammo_flare"] = "fusée·s éclairante·s", + ["ammo_flaregun"] = "fusée·s", -- Weapon Tints ["tint_default"] = "skin par défaut", diff --git a/server-data/resources/[esx]/es_extended/locales/he.lua b/server-data/resources/[esx]/es_extended/locales/he.lua new file mode 100644 index 000000000..bd37a2a5e --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/he.lua @@ -0,0 +1,375 @@ +Locales["he"] = { + -- Inventory + ["inventory"] = "מלאי ( משקל %s / %s )", + ["use"] = "השתמש", + ["give"] = "תן", + ["remove"] = "זרוק", + ["return"] = "חזור", + ["give_to"] = "תן ל", + ["amount"] = "כמות", + ["giveammo"] = "תן תחמושת", + ["amountammo"] = "כמות תחמושת", + ["noammo"] = "לא מספיק!", + ["gave_item"] = "ניתן %sx %s ל %s", + ["received_item"] = "קיבלת %sx %s מ %s", + ["gave_weapon"] = "ניתן %s ל %s", + ["gave_weapon_ammo"] = "ניתן ~o~%sx %s ל %s ל %s", + ["gave_weapon_withammo"] = "ניתן %s עם ~o~%sx %s ל %s", + ["gave_weapon_hasalready"] = "%s כבר יש לו %s", + ["gave_weapon_noweapon"] = "%s אין לו את הנשק הזה", + ["received_weapon"] = "קיבלת %s מ %s", + ["received_weapon_ammo"] = "קיבלת ~o~%sx %s ל %s שלך מ %s", + ["received_weapon_withammo"] = "קיבלת %s עם ~o~%sx %s מ %s", + ["received_weapon_hasalready"] = "%s ניסה לתת לך %s, אך יש לך כבר נשק זה", + ["received_weapon_noweapon"] = "%s ניסה לתת לך תחמושת ל %s, אך אין לך נשק זה", + ["gave_account_money"] = "ניתן $%s (%s) ל %s", + ["received_account_money"] = "קיבלת $%s (%s) מ %s", + ["amount_invalid"] = "כמות לא חוקית", + ["players_nearby"] = "אין שחקנים קרובים", + ["ex_inv_lim"] = "לא ניתן לבצע פעולה, חורג מהמשקל המרבי של %s", + ["imp_invalid_quantity"] = "לא ניתן לבצע פעולה, הכמות אינה חוקית", + ["imp_invalid_amount"] = "לא ניתן לבצע פעולה, הסכום אינו חוקי", + ["threw_standard"] = "זורק %sx %s", + ["threw_account"] = "זורק $%s %s", + ["threw_weapon"] = "זורק %s", + ["threw_weapon_ammo"] = "זורק %s עם ~o~%sx %s", + ["threw_weapon_already"] = "כבר יש לך נשק זה", + ["threw_cannot_pickup"] = "המלאי מלא, לא ניתן לאסוף!", + ["threw_pickup_prompt"] = "לחץ E כדי לאסוף", + -- Key mapping + ["keymap_showinventory"] = "הצג מלאי", + + -- Salary related + ["received_salary"] = "קיבלת שכר: $%s", + ["received_help"] = "קיבלת הטבה: $%s", + ["company_nomoney"] = "החברה בה אתה עובד אינה יכולה לשלם לך את השכר", + ["received_paycheck"] = "קיבלת תלוש", + ["bank"] = "בנק מעץ", + ["account_bank"] = "בנק", + ["account_black_money"] = "כסף מטונף", + ["account_money"] = "מזומן", + + ["act_imp"] = "לא ניתן לבצע פעולה", + ["in_vehicle"] = "לא ניתן לבצע פעולה, השחקן ברכב", + ["not_in_vehicle"] = "לא ניתן לבצע פעולה, השחקן לא ברכב", + + -- Commands + ["command_bring"] = "הבא שחקן אליך", + ["command_car"] = "צור רכב", + ["command_car_car"] = "דגם הרכב או האש", + ["command_cardel"] = "הסר רכבים בקרבת מקום", + ["command_cardel_radius"] = "הסר את כל הרכבים ברדיוס המצוין", + ["command_repair"] = "תקן את הרכב שלך", + ["command_repair_success"] = "רכב תוקן בהצלחה", + ["command_repair_success_target"] = "אדמין תיקן לך את הרכב", + ["command_clear"] = 'נקה טקסט צ"אט', + ["command_clearall"] = 'נקה טקסט צ"אט לכל השחקנים', + ["command_clearinventory"] = "הסר את כל הפריטים מהמלאי של השחקן", + ["command_clearloadout"] = "הסר את כל הנשקים מהשחקן", + ["command_freeze"] = "הקפא שחקן", + ["command_unfreeze"] = "בטל הקפאה של שחקן", + ["command_giveaccountmoney"] = "תן כסף לחשבון מסוים", + ["command_giveaccountmoney_account"] = "חשבון להוספה", + ["command_giveaccountmoney_amount"] = "כמות להוספה", + ["command_giveaccountmoney_invalid"] = "שם חשבון לא חוקי", + ["command_removeaccountmoney"] = "הסר כסף מחשבון מסוים", + ["command_removeaccountmoney_account"] = "חשבון להסרה ממנו", + ["command_removeaccountmoney_amount"] = "כמות להסרה", + ["command_removeaccountmoney_invalid"] = "שם חשבון לא חוקי", + ["command_giveitem"] = "תן לשחקן פריט", + ["command_giveitem_item"] = "שם הפריט", + ["command_giveitem_count"] = "כמות", + ["command_giveweapon"] = "תן לשחקן נשק", + ["command_giveweapon_weapon"] = "שם הנשק", + ["command_giveweapon_ammo"] = "כמות תחמושת", + ["command_giveweapon_hasalready"] = "לשחקן כבר יש נשק זה", + ["command_giveweaponcomponent"] = "תן רכיב נשק לשחקן", + ["command_giveweaponcomponent_component"] = "שם הרכיב", + ["command_giveweaponcomponent_invalid"] = "רכיב נשק לא חוקי", + ["command_giveweaponcomponent_hasalready"] = "לשחקן כבר יש רכיב נשק זה", + ["command_giveweaponcomponent_missingweapon"] = "לשחקן אין נשק זה", + ["command_goto"] = "התעבר אל שחקן", + ["command_kill"] = "הרוג שחקן", + ["command_save"] = "שמור נתונים של שחקן בכפיה", + ["command_saveall"] = "שמור נתונים של כל השחקנים", + ["command_setaccountmoney"] = "קבע כמות כסף בחשבון מסוים", + ["command_setaccountmoney_amount"] = "כמות כסף להגדרה", + ["command_setcoords"] = "התעבר לקואורדינטות מסוימות", + ["command_setcoords_x"] = "ערך x", + ["command_setcoords_y"] = "ערך y", + ["command_setcoords_z"] = "ערך z", + ["command_setjob"] = "קבע משרה לשחקן", + ["command_setjob_job"] = "שם המשרה", + ["command_setjob_grade"] = "דרגת המשרה", + ["command_setjob_invalid"] = "המשרה, הדרגה או שניהם אינם חוקיים", + ["command_setgroup"] = "קבע קבוצת הרשאות לשחקן", + ["command_setgroup_group"] = "שם קבוצת הפקודות", + ["commanderror_argumentmismatch"] = "כמות וסוגי הארגומנטים אינם תואמים (נשלח %s, נדרש %s)", + ["commanderror_argumentmismatch_number"] = "טיפוס ארגומנט #%s לא תקין (נשלח מחרוזת, נדרש מספר)", + ["commanderror_argumentmismatch_string"] = "טיפוס ארגומנט #%s לא תקין (נשלח מספר, נדרש מחרוזת)", + ["commanderror_invaliditem"] = "שם פריט לא חוקי", + ["commanderror_invalidweapon"] = "נשק לא חוקי", + ["commanderror_console"] = "לא ניתן להפעיל פקודה מהקונסול", + ["commanderror_invalidcommand"] = "פקודה לא חוקית - /%s", + ["commanderror_invalidplayerid"] = "אין שחקן עם מזהה זה מחובר", + ["commandgeneric_playerid"] = "מזהה השחקן בשרת", + ["command_giveammo_noweapon_found"] = "ל-%s אין נשק כזה", + ["command_giveammo_weapon"] = "שם הנשק", + ["command_giveammo_ammo"] = "כמות תחמושת", + ["tpm_nowaypoint"] = "אין נקודת דרך מוגדרת", + ["tpm_success"] = "הועברת בהצלחה", + + ["noclip_message"] = "מצב Noclip %s", + ["enabled"] = "~g~מאופשר~s~", + ["disabled"] = "~r~מנוטרל~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "₪%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "סכין", + ["weapon_bat"] = "כותרת", + ["weapon_battleaxe"] = "גרזן קרב", + ["weapon_bottle"] = "בקבוק", + ["weapon_crowbar"] = "מפתח ברזל", + ["weapon_flashlight"] = "פנס יד", + ["weapon_golfclub"] = "מקל גולף", + ["weapon_hammer"] = "פטיש", + ["weapon_hatchet"] = "גרזן", + ["weapon_knife"] = "סכין", + ["weapon_knuckle"] = "עצמאות", + ["weapon_machete"] = 'מאצ"טה', + ["weapon_nightstick"] = "מקל לילה", + ["weapon_wrench"] = "מפתח אינגליזי", + ["weapon_poolcue"] = "מקל בריכה", + ["weapon_stone_hatchet"] = "גרזן אבן", + ["weapon_switchblade"] = "סכין קפיצית", + -- Handguns + ["weapon_appistol"] = "אקדח AP", + ["weapon_ceramicpistol"] = "אקדח קרמי", + ["weapon_combatpistol"] = "אקדח קרב", + ["weapon_doubleaction"] = "רבולבר פעולה כפולה", + ["weapon_navyrevolver"] = "רבולבר צי", + ["weapon_flaregun"] = "אקדח זיקוקים", + ["weapon_gadgetpistol"] = "אקדח חומרה", + ["weapon_heavypistol"] = "אקדח כבד", + ["weapon_revolver"] = "רבולבר כבד", + ["weapon_revolver_mk2"] = "רבולבר כבד MK2", + ["weapon_marksmanpistol"] = "אקדח צלף", + ["weapon_pistol"] = "אקדח", + ["weapon_pistol_mk2"] = "אקדח MK2", + ["weapon_pistol50"] = "אקדח .50", + ["weapon_snspistol"] = "אקדח SNS", + ["weapon_snspistol_mk2"] = "אקדח SNS MK2", + ["weapon_stungun"] = "טייזר", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "אקדח וינטג", + + -- Shotguns + ["weapon_assaultshotgun"] = "רובה סטורם", + ["weapon_autoshotgun"] = "רובה אוטומטי", + ["weapon_bullpupshotgun"] = "רובה Bullpup", + ["weapon_combatshotgun"] = "רובה קרב", + ["weapon_dbshotgun"] = "רובה קנה כפול", + ["weapon_heavyshotgun"] = "רובה כבד", + ["weapon_musket"] = "רובה חלילי", + ["weapon_pumpshotgun"] = "רובה פומפה", + ["weapon_pumpshotgun_mk2"] = "רובה פומפה MK2", + ["weapon_sawnoffshotgun"] = "רובה חתוך", + + -- SMG & LMG + ["weapon_assaultsmg"] = "רובה סטורם SMG", + ["weapon_combatmg"] = "רובה סטורם MG", + ["weapon_combatmg_mk2"] = "רובה סטורם MG MK2", + ["weapon_combatpdw"] = "רובה סטורם PDW", + ["weapon_gusenberg"] = "רובה גוזנברג", + ["weapon_machinepistol"] = "אקדח מכונה", + ["weapon_mg"] = "רובה מכונה", + ["weapon_microsmg"] = "רובה מכונה מיקרו", + ["weapon_minismg"] = "רובה מכונה מיני", + ["weapon_smg"] = "רובה מכונה", + ["weapon_smg_mk2"] = "רובה מכונה MK2", + ["weapon_raycarbine"] = "רובה אור", + -- Rifles + ["weapon_advancedrifle"] = "רובה מתקדם", + ["weapon_assaultrifle"] = "רובה סטורם", + ["weapon_assaultrifle_mk2"] = "רובה סטורם MK2", + ["weapon_bullpuprifle"] = "רובה Bullpup", + ["weapon_bullpuprifle_mk2"] = "רובה Bullpup MK2", + ["weapon_carbinerifle"] = "רובה קרבין", + ["weapon_carbinerifle_mk2"] = "רובה קרבין MK2", + ["weapon_compactrifle"] = "רובה קומפקטי", + ["weapon_militaryrifle"] = "רובה צבאי", + ["weapon_specialcarbine"] = "רובה קרבין מיוחד", + ["weapon_specialcarbine_mk2"] = "רובה קרבין מיוחד MK2", + ["weapon_heavyrifle"] = "רובה כבד", + + -- Sniper + ["weapon_heavysniper"] = "רובה צלפים כבד", + ["weapon_heavysniper_mk2"] = "רובה צלפים כבד MK2", + ["weapon_marksmanrifle"] = "רובה צלפים", + ["weapon_marksmanrifle_mk2"] = "רובה צלפים MK2", + ["weapon_sniperrifle"] = "רובה צלפים", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "משגר קומפקטי", + ["weapon_firework"] = "משגר זיקוקים", + ["weapon_grenadelauncher"] = "משגר רימונים", + ["weapon_hominglauncher"] = "משגר חפצים", + ["weapon_minigun"] = "מיניגן", + ["weapon_railgun"] = "רובה רכבת", + ["weapon_rpg"] = "משגר רקטות", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "גלאי מתכות", + ["weapon_precisionrifle"] = "רובה דיוק", + ["weapon_tactilerifle"] = "רובה טקטילי", + + -- Drug wars dlc + ["weapon_candycane"] = "מקל סוכר", + ["weapon_acidpackage"] = "חומצה", + ["weapon_pistolxm3"] = "אקדח xm3", + ["weapon_railgunxm3"] = "רובה רכבת xm3", + -- Thrown + ["weapon_ball"] = "כדור בייסבול", + ["weapon_bzgas"] = "גז BZ", + ["weapon_flare"] = "זיקוק", + ["weapon_grenade"] = "רימון", + ["weapon_petrolcan"] = "גררון דלק", + ["weapon_hazardcan"] = "גררון מסוכן", + ["weapon_molotov"] = "קוקטייל מולוטוב", + ["weapon_proxmine"] = "מוקש קרבה", + ["weapon_pipebomb"] = "פצצת צינור", + ["weapon_snowball"] = "כדור שלג", + ["weapon_stickybomb"] = "פצצה דביקה", + ["weapon_smokegrenade"] = "גז דמעות", + + -- Special + ["weapon_fireextinguisher"] = "מטף כיבוי", + ["weapon_digiscanner"] = "סורק דיגיטלי", + ["weapon_garbagebag"] = "שקית זבל", + ["weapon_handcuffs"] = "כפפות", + ["gadget_nightvision"] = "ראיה לילית", + ["gadget_parachute"] = "צניחה", + + -- Weapon Components + ["component_knuckle_base"] = "דגם בסיסי", + ["component_knuckle_pimp"] = "הפימפ", + ["component_knuckle_ballas"] = "הבאלס", + ["component_knuckle_dollar"] = "ההאסטלר", + ["component_knuckle_diamond"] = "הרוק", + ["component_knuckle_hate"] = "השונא", + ["component_knuckle_love"] = "האוהב", + ["component_knuckle_player"] = "השחקן", + ["component_knuckle_king"] = "המלך", + ["component_knuckle_vagos"] = "הואגוס", + ["component_luxary_finish"] = "גימור מפואר", + + ["component_handle_default"] = "ידית רגילה", + ["component_handle_vip"] = "ידית VIP", + ["component_handle_bodyguard"] = "ידית שומר גוף", + + ["component_vip_finish"] = "גימור VIP", + ["component_bodyguard_finish"] = "גימור שומר גוף", + + ["component_camo_finish"] = "צפיעה דיגיטלית", + ["component_camo_finish2"] = "צפיעה צבעים מעורבים", + ["component_camo_finish3"] = "צפיעה יערותית", + ["component_camo_finish4"] = "צפיעה גולגולת", + ["component_camo_finish5"] = "צפיעה Sessanta Nove", + ["component_camo_finish6"] = "צפיעה Perseus", + ["component_camo_finish7"] = "צפיעה נמרים", + ["component_camo_finish8"] = "צפיעה זברה", + ["component_camo_finish9"] = "צפיעה גיאומטרית", + ["component_camo_finish10"] = "צפיעה Boom", + ["component_camo_finish11"] = "צפיעה פטריוטית", + + ["component_camo_slide_finish"] = "צפיעה דיגיטלית למחצלה", + ["component_camo_slide_finish2"] = "צפיעה צבעים מעורבים למחצלה", + ["component_camo_slide_finish3"] = "צפיעה יערותית למחצלה", + ["component_camo_slide_finish4"] = "צפיעה גולגולת למחצלה", + ["component_camo_slide_finish5"] = "צפיעה Sessanta Nove למחצלה", + ["component_camo_slide_finish6"] = "צפיעה Perseus למחצלה", + ["component_camo_slide_finish7"] = "צפיעה נמרים למחצלה", + ["component_camo_slide_finish8"] = "צפיעה זברה למחצלה", + ["component_camo_slide_finish9"] = "צפיעה גיאומטרית למחצלה", + ["component_camo_slide_finish10"] = "צפיעה Boom למחצלה", + ["component_camo_slide_finish11"] = "צפיעה פטריוטית למחצלה", + ["component_clip_default"] = "מחצירה רגילה", + ["component_clip_extended"] = "מחצירה מורחבת", + ["component_clip_drum"] = "מחצירה תוף", + ["component_clip_box"] = "מחצירה קופסה", + + ["component_scope_holo"] = "כוונת הולוגרפית", + ["component_scope_small"] = "כוונת קטנה", + ["component_scope_medium"] = "כוונת בינונית", + ["component_scope_large"] = "כוונת גדולה", + ["component_scope"] = "כוונת מותקנת", + ["component_scope_advanced"] = "כוונת מתקדמת", + ["component_ironsights"] = "כוונת ברזל", + + ["component_suppressor"] = "מרגיע", + ["component_compensator"] = "פיצוי", + + ["component_muzzle_flat"] = "מרסור שטוח", + ["component_muzzle_tactical"] = "מרסור טקטי", + ["component_muzzle_fat"] = "מרסור עגלגל", + ["component_muzzle_precision"] = "מרסור מדויק", + ["component_muzzle_heavy"] = "מרסור כבד", + ["component_muzzle_slanted"] = "מרסור מוטה", + ["component_muzzle_split"] = "מרסור פצול", + ["component_muzzle_squared"] = "מרסור מרובע", + + ["component_flashlight"] = "פנס", + ["component_grip"] = "אחיזה", + + ["component_barrel_default"] = "עצם רגיל", + ["component_barrel_heavy"] = "עצם כבד", + + ["component_ammo_tracer"] = "כדורים עקובים", + ["component_ammo_incendiary"] = "כדורים מדליקים", + ["component_ammo_hollowpoint"] = "כדורים חדים", + ["component_ammo_fmj"] = "כדורים FMJ", + ["component_ammo_armor"] = "כדורים חודרי משרוע", + ["component_ammo_explosive"] = "כדורים חודרי משרוע מדליקים", + + ["component_shells_default"] = "גלעינים רגילים", + ["component_shells_incendiary"] = "גלעינים מדליקים", + ["component_shells_armor"] = "גלעינים פלדלים", + ["component_shells_hollowpoint"] = "גלעינים חדים", + ["component_shells_explosive"] = "גלעינים מתפוצצים", + + -- Weapon Ammo + ["ammo_rounds"] = "כדור(ים)", + ["ammo_shells"] = "גלעין(ים)", + ["ammo_charge"] = "טעינה", + ["ammo_petrol"] = "גלונים של דלק", + ["ammo_firework"] = "זיקוק(ים)", + ["ammo_rockets"] = "טיל(ים)", + ["ammo_grenadelauncher"] = "רימון(ים)", + ["ammo_grenade"] = "רימון(ים)", + ["ammo_stickybomb"] = "פצצה/ות", + ["ammo_pipebomb"] = "פצצה/ות", + ["ammo_smokebomb"] = "פצצה/ות", + ["ammo_molotov"] = "קוקטייל(ים)", + ["ammo_proxmine"] = "מוקש/ים", + ["ammo_bzgas"] = "פח/ית", + ["ammo_ball"] = "כדור/ים", + ["ammo_snowball"] = "כדור/ים שלג", + ["ammo_flare"] = "זיקוק/ים", + ["ammo_flaregun"] = "זיקוק/ים", + + -- Weapon Tints + ["tint_default"] = "צבע רגיל", + ["tint_green"] = "צבע ירוק", + ["tint_gold"] = "צבע זהב", + ["tint_pink"] = "צבע ורוד", + ["tint_army"] = "צבע צבאי", + ["tint_lspd"] = "צבע כחול", + ["tint_orange"] = "צבע כתום", + ["tint_platinum"] = "צבע פלטינה", +} diff --git a/server-data/resources/[esx]/es_extended/locales/hu.lua b/server-data/resources/[esx]/es_extended/locales/hu.lua index 608dec82a..1f5f81b92 100644 --- a/server-data/resources/[esx]/es_extended/locales/hu.lua +++ b/server-data/resources/[esx]/es_extended/locales/hu.lua @@ -52,6 +52,7 @@ Locales["hu"] = { ["act_imp"] = "Érvénytelen mennyiség", ["in_vehicle"] = "Nem tudod átadni, mivel benne ül a jármüben", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", -- Commands ["command_bring"] = "Játékos magadhoz teleportálása", @@ -59,6 +60,9 @@ Locales["hu"] = { ["command_car_car"] = "Jármű név vagy hash", ["command_cardel"] = "Közeli járművek törlése", ["command_cardel_radius"] = "Megadott radiusban lévő járművek törlése", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", ["command_clear"] = "Chat ürítése", ["command_clearall"] = "Chat ürítése minden játékosnál", ["command_clearinventory"] = "Minden tárgy törlése a játékos inventoryból", @@ -99,12 +103,22 @@ Locales["hu"] = { ["command_setgroup_group"] = "Csoport neve", ["commanderror_argumentmismatch"] = "Érvénytelen argumentumszám (%s megadva, %s szükséges)", ["commanderror_argumentmismatch_number"] = "Érvénytelen argumentum #%s adat típus (szöveg megadva, szám szükséges)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", ["commanderror_invaliditem"] = "Érvénytelen tárgy", ["commanderror_invalidweapon"] = "Érvénytelen fegyver", ["commanderror_console"] = "Parancs nem használható konzolból", ["commanderror_invalidcommand"] = "Érvénytelen parancs - /%s", ["commanderror_invalidplayerid"] = "Megadott játékos nem online.", ["commandgeneric_playerid"] = "Játékos Szerver Id", + ["command_giveammo_noweapon_found"] = "Nincs ilyen fegyvered: %s", + ["command_giveammo_weapon"] = "Fegyver név", + ["command_giveammo_ammo"] = "Lőszer mennyiség", + ["tpm_nowaypoint"] = "Nincs kijelölve pozíció!", + ["tpm_success"] = "Sikeres teleportálás", + + ["noclip_message"] = "Noclip %s", + ["enabled"] = "~g~engedélyezve~s~", + ["disabled"] = "~r~letiltva~s~", -- Locale settings ["locale_digit_grouping_symbol"] = ",", @@ -190,6 +204,7 @@ Locales["hu"] = { ["weapon_militaryrifle"] = "Military Rifle", ["weapon_specialcarbine"] = "Special Carbine", ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated -- Sniper ["weapon_heavysniper"] = "Heavy Sniper", @@ -213,6 +228,12 @@ Locales["hu"] = { ["weapon_precisionrifle"] = "Precision Rifle", ["weapon_tactilerifle"] = "Service Carbine", + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + -- Thrown ["weapon_ball"] = "Baseball", ["weapon_bzgas"] = "BZ Gas", @@ -353,4 +374,8 @@ Locales["hu"] = { ["tint_lspd"] = "blue skin", ["tint_orange"] = "orange skin", ["tint_platinum"] = "platinum skin", + + -- Duty related + ["stopped_duty"] = "Leadtad a szolgálatot.", + ["started_duty"] = "Szolgálatba álltál.", } diff --git a/server-data/resources/[esx]/es_extended/locales/id.lua b/server-data/resources/[esx]/es_extended/locales/id.lua new file mode 100644 index 000000000..11ab47fe2 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/id.lua @@ -0,0 +1,381 @@ +Locales["id"] = { + -- Inventory + ["inventory"] = "Inventaris ( Berat %s / %s )", + ["use"] = "Gunakan", + ["give"] = "Beri", + ["remove"] = "Buang", + ["return"] = "Kembali", + ["give_to"] = "Beri ke", + ["amount"] = "Jumlah", + ["giveammo"] = "Beri amunisi", + ["amountammo"] = "Jumlah Amunisi", + ["noammo"] = "Tidak cukup!", + ["gave_item"] = "Memberi %sx %s ke %s", + ["received_item"] = "Menerima %sx %s dari %s", + ["gave_weapon"] = "Memberi %s ke %s", + ["gave_weapon_ammo"] = "Memberi ~o~%sx %s untuk %s ke %s", + ["gave_weapon_withammo"] = "Memberi %s dengan ~o~%sx %s ke %s", + ["gave_weapon_hasalready"] = "%s sudah memiliki %s", + ["gave_weapon_noweapon"] = "%s tidak memiliki senjata tersebut", + ["received_weapon"] = "Menerima %s dari %s", + ["received_weapon_ammo"] = "Menerima ~o~%sx %s untuk %s Anda dari %s", + ["received_weapon_withammo"] = "Menerima %s dengan ~o~%sx %s dari %s", + ["received_weapon_hasalready"] = "%s mencoba memberimu %s, tapi kamu sudah memiliki senjata ini", + ["received_weapon_noweapon"] = "%s mencoba memberimu amunisi untuk %s, tapi kamu tidak memiliki senjata ini", + ["gave_account_money"] = "Memberi $%s (%s) ke %s", + ["received_account_money"] = "Menerima $%s (%s) dari %s", + ["amount_invalid"] = "Jumlah salah", + ["players_nearby"] = "Tidak ada Player di sekitar", + ["ex_inv_lim"] = "Tidak dapat melakukan aksi, melebihi batas berat dari %s", + ["imp_invalid_quantity"] = "Tidak dapat melakukan aksi, jumlah salah", + ["imp_invalid_amount"] = "Tidak dapat melakukan aksi, jumlah salah", + ["threw_standard"] = "Membuang %sx %s", + ["threw_account"] = "Membuang $%s %s", + ["threw_weapon"] = "Membuang %s", + ["threw_weapon_ammo"] = "Membuang %s dengan ~o~%sx %s", + ["threw_weapon_already"] = "Kamu sudah memiliki senjata ini", + ["threw_cannot_pickup"] = "Inventaris penuh, Tidak dapat mengambil!", + ["threw_pickup_prompt"] = "Tekan E untuk Mengambil", + + -- Key mapping + ["keymap_showinventory"] = "Buka Inventaris", + + -- Salary related + ["received_salary"] = "Anda telah dibayar: $%s", + ["received_help"] = "Anda telah menerima dana kesejahteraan: $%s", + ["company_nomoney"] = "perusahaan tempat Anda bekerja terlalu miskin untuk membayar gaji Anda", + ["received_paycheck"] = "menerima gaji", + ["bank"] = "Maze Bank", + ["account_bank"] = "Bank", + ["account_black_money"] = "Dirty Money", + ["account_money"] = "Cash", + + ["act_imp"] = "Tidak dapat melakukan aksi", + ["in_vehicle"] = "Tidak dapat melakukan aksi, Player di dalam kendaraan", + ["not_in_vehicle"] = "Tidak dapat melakukan aksi, Player tidak di dalam kendaraan", + + -- Commands + ["command_bring"] = "Bawa player kepadamu", + ["command_car"] = "Munculkan kendaraan", + ["command_car_car"] = "Model atau hash kendaraan", + ["command_cardel"] = "Menghilangkan kendaraan di sekitar", + ["command_cardel_radius"] = "Menghilangkan semua kendaraan dalam radius yang ditentukan", + ["command_repair"] = "Perbaiki kendaraanmu", + ["command_repair_success"] = "Berhasil memperbaiki kendaraan", + ["command_repair_success_target"] = "Admin memperbaiki kendaraanmu", + ["command_clear"] = "Bersihkan teks chat", + ["command_clearall"] = "Bersihkan teks chat untuk semua player", + ["command_clearinventory"] = "Hilangkan semua barang dari Inventaris Player", + ["command_clearloadout"] = "Hilangkan semua senjata dari Loadout Player", + ["command_freeze"] = "Bekukan player", + ["command_unfreeze"] = "Kembalikan player", + ["command_giveaccountmoney"] = "Beri uang ke rekening tertentu", + ["command_giveaccountmoney_account"] = "Rekening untuk ditambahkan", + ["command_giveaccountmoney_amount"] = "Jumlah untuk ditambahkan", + ["command_giveaccountmoney_invalid"] = "Nama Rekening Salah", + ["command_removeaccountmoney"] = "Hilangkan uang dari rekening tertentu", + ["command_removeaccountmoney_account"] = "Rekening yang akan dihapus", + ["command_removeaccountmoney_amount"] = "Jumlah yang dihapus", + ["command_removeaccountmoney_invalid"] = "Nama Rekening Salah", + ["command_giveitem"] = "Beri Player barang", + ["command_giveitem_item"] = "Nama Barang", + ["command_giveitem_count"] = "Jumlah", + ["command_giveweapon"] = "Beri player senjata", + ["command_giveweapon_weapon"] = "Nama Senjata", + ["command_giveweapon_ammo"] = "Jumlah Amunisi", + ["command_giveweapon_hasalready"] = "Player telah memiliki senjata ini", + ["command_giveweaponcomponent"] = "Beri komponen senjata ke player", + ["command_giveweaponcomponent_component"] = "Nama Komponen", + ["command_giveweaponcomponent_invalid"] = "Komponen Senjata Salah", + ["command_giveweaponcomponent_hasalready"] = "Player telah memiliki komponen senjata ini", + ["command_giveweaponcomponent_missingweapon"] = "Player tidak memiliki senjata ini", + ["command_goto"] = "Teleportasi dirimu ke player", + ["command_kill"] = "Bunuh player", + ["command_save"] = "Paksa Simpan Data player", + ["command_saveall"] = "Paksa Simpan Data semua player", + ["command_setaccountmoney"] = "Atur uang dalam rekening tertentu", + ["command_setaccountmoney_amount"] = "Jumlah", + ["command_setcoords"] = "Teleportasi ke koordinat tertentu", + ["command_setcoords_x"] = "Posisi X", + ["command_setcoords_y"] = "Posisi Y", + ["command_setcoords_z"] = "Posisi Z", + ["command_setjob"] = "Beri player pekerjaan", + ["command_setjob_job"] = "Nama", + ["command_setjob_grade"] = "Jabatan pekerjaan", + ["command_setjob_invalid"] = "pekerjaan, jabatan atau keduanya salah", + ["command_setgroup"] = "Atur izn grup player", + ["command_setgroup_group"] = "Nama Grup", + ["commanderror_argumentmismatch"] = "Jumlah Argument Salah (passed %s, wanted %s)", + ["commanderror_argumentmismatch_number"] = "Argument #%s salah tipe data (passed string, wanted number)", + ["commanderror_argumentmismatch_string"] = "Argument #%s salah tipe data (passed number, wanted string)", + ["commanderror_invaliditem"] = "Barang salah", + ["commanderror_invalidweapon"] = "Senjata salah", + ["commanderror_console"] = "Perintah tidak dapat dieksekusi dari console", + ["commanderror_invalidcommand"] = "Perintah Salah - /%s", + ["commanderror_invalidplayerid"] = "Player tersebut tidak online", + ["commandgeneric_playerid"] = "Id Server Player", + ["command_giveammo_noweapon_found"] = "%s tidak memiliki senjata tersebut", + ["command_giveammo_weapon"] = "Nama Senjata", + ["command_giveammo_ammo"] = "Jumlah Amunisi", + ["tpm_nowaypoint"] = "Titik Lokasi Tidak Diatur.", + ["tpm_success"] = "Berhasil Teleportasi", + + ["noclip_message"] = "Noclip telah %s", + ["enabled"] = "~g~diaktifkan~s~", + ["disabled"] = "~r~dimatikan~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "£%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "Dagger", + ["weapon_bat"] = "Bat", + ["weapon_battleaxe"] = "Battle Axe", + ["weapon_bottle"] = "Bottle", + ["weapon_crowbar"] = "Crowbar", + ["weapon_flashlight"] = "Flashlight", + ["weapon_golfclub"] = "Golf Club", + ["weapon_hammer"] = "Hammer", + ["weapon_hatchet"] = "Hatchet", + ["weapon_knife"] = "Knife", + ["weapon_knuckle"] = "Knuckledusters", + ["weapon_machete"] = "Machete", + ["weapon_nightstick"] = "Nightstick", + ["weapon_wrench"] = "Pipe Wrench", + ["weapon_poolcue"] = "Pool Cue", + ["weapon_stone_hatchet"] = "Stone Hatchet", + ["weapon_switchblade"] = "Switchblade", + + -- Handguns + ["weapon_appistol"] = "AP Pistol", + ["weapon_ceramicpistol"] = "Ceramic Pistol", + ["weapon_combatpistol"] = "Combat Pistol", + ["weapon_doubleaction"] = "Double-Action Revolver", + ["weapon_navyrevolver"] = "Navy Revolver", + ["weapon_flaregun"] = "Flaregun", + ["weapon_gadgetpistol"] = "Gadget Pistol", + ["weapon_heavypistol"] = "Heavy Pistol", + ["weapon_revolver"] = "Heavy Revolver", + ["weapon_revolver_mk2"] = "Heavy Revolver MK2", + ["weapon_marksmanpistol"] = "Marksman Pistol", + ["weapon_pistol"] = "Pistol", + ["weapon_pistol_mk2"] = "Pistol MK2", + ["weapon_pistol50"] = "Pistol .50", + ["weapon_snspistol"] = "SNS Pistol", + ["weapon_snspistol_mk2"] = "SNS Pistol MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Vintage Pistol", + + -- Shotguns + ["weapon_assaultshotgun"] = "Assault Shotgun", + ["weapon_autoshotgun"] = "Auto Shotgun", + ["weapon_bullpupshotgun"] = "Bullpup Shotgun", + ["weapon_combatshotgun"] = "Combat Shotgun", + ["weapon_dbshotgun"] = "Double Barrel Shotgun", + ["weapon_heavyshotgun"] = "Heavy Shotgun", + ["weapon_musket"] = "Musket", + ["weapon_pumpshotgun"] = "Pump Shotgun", + ["weapon_pumpshotgun_mk2"] = "Pump Shotgun MK2", + ["weapon_sawnoffshotgun"] = "Sawed Off Shotgun", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Assault SMG", + ["weapon_combatmg"] = "Combat MG", + ["weapon_combatmg_mk2"] = "Combat MG MK2", + ["weapon_combatpdw"] = "Combat PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Machine Pistol", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Unholy Hellbringer", + + -- Rifles + ["weapon_advancedrifle"] = "Advanced Rifle", + ["weapon_assaultrifle"] = "Assault Rifle", + ["weapon_assaultrifle_mk2"] = "Assault Rifle MK2", + ["weapon_bullpuprifle"] = "Bullpup Rifle", + ["weapon_bullpuprifle_mk2"] = "Bullpup Rifle MK2", + ["weapon_carbinerifle"] = "Carbine Rifle", + ["weapon_carbinerifle_mk2"] = "Carbine Rifle MK2", + ["weapon_compactrifle"] = "Compact Rifle", + ["weapon_militaryrifle"] = "Military Rifle", + ["weapon_specialcarbine"] = "Special Carbine", + ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", + + -- Sniper + ["weapon_heavysniper"] = "Heavy Sniper", + ["weapon_heavysniper_mk2"] = "Heavy Sniper MK2", + ["weapon_marksmanrifle"] = "Marksman Rifle", + ["weapon_marksmanrifle_mk2"] = "Marksman Rifle MK2", + ["weapon_sniperrifle"] = "Sniper Rifle", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Compact Launcher", + ["weapon_firework"] = "Firework Launcher", + ["weapon_grenadelauncher"] = "Grenade Launcher", + ["weapon_hominglauncher"] = "Homing Launcher", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Rocket Launcher", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metal Detector", + ["weapon_precisionrifle"] = "Precision Rifle", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug wars dlc + ["weapon_candycane"] = "Candycane", + ["weapon_acidpackage"] = "Acid Package", + ["weapon_pistolxm3"] = "Pistol8 x3m", + ["weapon_railgunxm3"] = "Railgun", + + -- Thrown + ["weapon_ball"] = "Baseball", + ["weapon_bzgas"] = "BZ Gas", + ["weapon_flare"] = "Flare", + ["weapon_grenade"] = "Grenade", + ["weapon_petrolcan"] = "Jerrycan", + ["weapon_hazardcan"] = "Hazardous Jerrycan", + ["weapon_molotov"] = "Molotov Cocktail", + ["weapon_proxmine"] = "Proximity Mine", + ["weapon_pipebomb"] = "Pipe Bomb", + ["weapon_snowball"] = "Snowball", + ["weapon_stickybomb"] = "Sticky Bomb", + ["weapon_smokegrenade"] = "Tear Gas", + + -- Special + ["weapon_fireextinguisher"] = "Pemadam Api", + ["weapon_digiscanner"] = "Digital Scanner", + ["weapon_garbagebag"] = "Kantong Sampah", + ["weapon_handcuffs"] = "Borgol", + ["gadget_nightvision"] = "Night Vision", + ["gadget_parachute"] = "Parasut", + + -- Weapon Components + ["component_knuckle_base"] = "base Model", + ["component_knuckle_pimp"] = "the Pimp", + ["component_knuckle_ballas"] = "the Ballas", + ["component_knuckle_dollar"] = "the Hustler", + ["component_knuckle_diamond"] = "the Rock", + ["component_knuckle_hate"] = "the Hater", + ["component_knuckle_love"] = "the Lover", + ["component_knuckle_player"] = "the Player", + ["component_knuckle_king"] = "the King", + ["component_knuckle_vagos"] = "the Vagos", + + ["component_luxary_finish"] = "luxary Weapon Finish", + + ["component_handle_default"] = "default Handle", + ["component_handle_vip"] = "vIP Handle", + ["component_handle_bodyguard"] = "bodyguard Handle", + + ["component_vip_finish"] = "vIP Finish", + ["component_bodyguard_finish"] = "bodyguard Finish", + + ["component_camo_finish"] = "digital Camo", + ["component_camo_finish2"] = "brushstroke Camo", + ["component_camo_finish3"] = "woodland Camo", + ["component_camo_finish4"] = "skull Camo", + ["component_camo_finish5"] = "sessanta Nove Camo", + ["component_camo_finish6"] = "perseus Camo", + ["component_camo_finish7"] = "leopard Camo", + ["component_camo_finish8"] = "zebra Camo", + ["component_camo_finish9"] = "geometric Camo", + ["component_camo_finish10"] = "boom Camo", + ["component_camo_finish11"] = "patriotic Camo", + + ["component_camo_slide_finish"] = "digital Slide Camo", + ["component_camo_slide_finish2"] = "brushstroke Slide Camo", + ["component_camo_slide_finish3"] = "woodland Slide Camo", + ["component_camo_slide_finish4"] = "skull Slide Camo", + ["component_camo_slide_finish5"] = "sessanta Nove Slide Camo", + ["component_camo_slide_finish6"] = "perseus Slide Camo", + ["component_camo_slide_finish7"] = "leopard Slide Camo", + ["component_camo_slide_finish8"] = "zebra Slide Camo", + ["component_camo_slide_finish9"] = "geometric Slide Camo", + ["component_camo_slide_finish10"] = "boom Slide Camo", + ["component_camo_slide_finish11"] = "patriotic Slide Camo", + + ["component_clip_default"] = "default Magazine", + ["component_clip_extended"] = "extended Magazine", + ["component_clip_drum"] = "drum Magazine", + ["component_clip_box"] = "box Magazine", + + ["component_scope_holo"] = "holographic Scope", + ["component_scope_small"] = "small Scope", + ["component_scope_medium"] = "medium Scope", + ["component_scope_large"] = "large Scope", + ["component_scope"] = "mounted Scope", + ["component_scope_advanced"] = "advanced Scope", + ["component_ironsights"] = "ironsights", + + ["component_suppressor"] = "suppressor", + ["component_compensator"] = "compensator", + + ["component_muzzle_flat"] = "flat Muzzle Brake", + ["component_muzzle_tactical"] = "tactical Muzzle Brake", + ["component_muzzle_fat"] = "fat-End Muzzle Brake", + ["component_muzzle_precision"] = "precision Muzzle Brake", + ["component_muzzle_heavy"] = "heavy Duty Muzzle Brake", + ["component_muzzle_slanted"] = "slanted Muzzle Brake", + ["component_muzzle_split"] = "split-End Muzzle Brake", + ["component_muzzle_squared"] = "squared Muzzle Brake", + + ["component_flashlight"] = "flashlight", + ["component_grip"] = "grip", + + ["component_barrel_default"] = "default Barrel", + ["component_barrel_heavy"] = "heavy Barrel", + + ["component_ammo_tracer"] = "tracer Ammo", + ["component_ammo_incendiary"] = "incendiary Ammo", + ["component_ammo_hollowpoint"] = "hollowpoint Ammo", + ["component_ammo_fmj"] = "fMJ Ammo", + ["component_ammo_armor"] = "armor Piercing Ammo", + ["component_ammo_explosive"] = "armor Piercing Incendiary Ammo", + + ["component_shells_default"] = "default Shells", + ["component_shells_incendiary"] = "dragons Breath Shells", + ["component_shells_armor"] = "steel Buckshot Shells", + ["component_shells_hollowpoint"] = "flechette Shells", + ["component_shells_explosive"] = "explosive Slug Shells", + + -- Weapon Ammo + ["ammo_rounds"] = "peluru", + ["ammo_shells"] = "peluru", + ["ammo_charge"] = "peluru", + ["ammo_petrol"] = "gallon bahan bakar", + ["ammo_firework"] = "kembang api", + ["ammo_rockets"] = "roket", + ["ammo_grenadelauncher"] = "granat", + ["ammo_grenade"] = "granat", + ["ammo_stickybomb"] = "bom", + ["ammo_pipebomb"] = "bom pipa", + ["ammo_smokebomb"] = "bom asap", + ["ammo_molotov"] = "molotov", + ["ammo_proxmine"] = "peledak", + ["ammo_bzgas"] = "kaleng", + ["ammo_ball"] = "bola", + ["ammo_snowball"] = "bola salju", + ["ammo_flare"] = "flare", + ["ammo_flaregun"] = "flare", + + -- Weapon Tints + ["tint_default"] = "default skin", + ["tint_green"] = "green skin", + ["tint_gold"] = "gold skin", + ["tint_pink"] = "pink skin", + ["tint_army"] = "army skin", + ["tint_lspd"] = "blue skin", + ["tint_orange"] = "orange skin", + ["tint_platinum"] = "platinum skin", +} diff --git a/server-data/resources/[esx]/es_extended/locales/it.lua b/server-data/resources/[esx]/es_extended/locales/it.lua new file mode 100644 index 000000000..ac5a9334f --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/it.lua @@ -0,0 +1,381 @@ +Locales["it"] = { + -- Inventory + ["inventory"] = "Inventario ( Peso %s / %s )", + ["use"] = "Usa", + ["give"] = "Dai", + ["remove"] = "Butta", + ["return"] = "Ritorna", + ["give_to"] = "Dai a", + ["amount"] = "Quantità", + ["giveammo"] = "Dai munizioni", + ["amountammo"] = "Quantità munizioni", + ["noammo"] = "Non abbastanza!", + ["gave_item"] = "Dando %sx %s a %s", + ["received_item"] = "Ricevuto %sx %s da %s", + ["gave_weapon"] = "Dando %s a %s", + ["gave_weapon_ammo"] = "Dando ~o~%sx %s for %s to %s", + ["gave_weapon_withammo"] = "Dando %s con ~o~%sx %s a %s", + ["gave_weapon_hasalready"] = "%s possiede già %s", + ["gave_weapon_noweapon"] = "%s non ha quell' arma", + ["received_weapon"] = "Ricevuto %s da %s", + ["received_weapon_ammo"] = "Ricevuto ~o~%sx %s per il tuo %s da %s", + ["received_weapon_withammo"] = "Ricevuto %s con ~o~%sx %s per %s", + ["received_weapon_hasalready"] = "%s ha tentato di darti %s, ma hai già l'arma", + ["received_weapon_noweapon"] = "%s ha tentato di darti munizioni per %s, ma non hai l'arma", + ["gave_account_money"] = "Dando $%s (%s) a %s", + ["received_account_money"] = "Ricevuto $%s (%s) da %s", + ["amount_invalid"] = "Quantità non valida", + ["players_nearby"] = "Nessun giocatore vicino", + ["ex_inv_lim"] = "Non puoi farlo, eccedi il peso di %s", + ["imp_invalid_quantity"] = "Non puoi farlo, quantità non valida", + ["imp_invalid_amount"] = "Non puoi farlo, importo non valido", + ["threw_standard"] = "Gettando %sx %s", + ["threw_account"] = "Gettando $%s %s", + ["threw_weapon"] = "Gettando %s", + ["threw_weapon_ammo"] = "Gettando %s con ~o~%sx %s", + ["threw_weapon_already"] = "Hai gia quest' arma", + ["threw_cannot_pickup"] = "Inventario pieno, non puoi raccogliere!", + ["threw_pickup_prompt"] = "Premi E per raccogliere", + + -- Key mapping + ["keymap_showinventory"] = "Apri inventario", + + -- Salary related + ["received_salary"] = "Sei stato pagato: $%s", + ["received_help"] = "Hai ricevuto il reddito di cittadinanza: $%s", + ["company_nomoney"] = "La tua compagnia è troppo povera per pagarti", + ["received_paycheck"] = "Ricveuto stipendio", + ["bank"] = "Banca", + ["account_bank"] = "Conto", + ["account_black_money"] = "Soldi sporchi", + ["account_money"] = "Contanti", + + ["act_imp"] = "Non puoi farlo", + ["in_vehicle"] = "Non puoi farlo, il giocatore è in un veicolo", + ["not_in_vehicle"] = "Non puoi farlo, il player non è in un veicolo", + + -- Commands + ["command_bring"] = "Porta il giocatore da te", + ["command_car"] = "Spawna un veicolo", + ["command_car_car"] = "Modello o hash veicolo", + ["command_cardel"] = "Rimuovi i veicoli nelle prossimità", + ["command_cardel_radius"] = "Rimuovi i veicoli nel raggio specificato", + ["command_repair"] = "Ripara il tuo veicolo", + ["command_repair_success"] = "Hai riparato il veicolo con successo", + ["command_repair_success_target"] = "Un admin ha riparato la tua macchina", + ["command_clear"] = "Pulisci la chat testuale", + ["command_clearall"] = "Pulisci la chat testuale per tutti i giocatori", + ["command_clearinventory"] = "Rimuovi tutti gli oggetti dall' inventario del giocatore", + ["command_clearloadout"] = "Rimuovi tutte le armi dal loadout del giocatore", + ["command_freeze"] = "Blocca un giocatore", + ["command_unfreeze"] = "Sblocca un giocatore", + ["command_giveaccountmoney"] = "Dai soldi a un' account specifico", + ["command_giveaccountmoney_account"] = "Account a cui aggiungere", + ["command_giveaccountmoney_amount"] = "Quantità da aggiungere", + ["command_giveaccountmoney_invalid"] = "Nome account non valido", + ["command_removeaccountmoney"] = "Rimuovi soldi da un account specifico", + ["command_removeaccountmoney_account"] = "Account a cui togliere", + ["command_removeaccountmoney_amount"] = "Quantità da rimuovere", + ["command_removeaccountmoney_invalid"] = "Nome account non valido", + ["command_giveitem"] = "Dai un oggetto ad un giocatore", + ["command_giveitem_item"] = "Nome oggetto", + ["command_giveitem_count"] = "Quantità", + ["command_giveweapon"] = "Dai un' arma ad un giocatore", + ["command_giveweapon_weapon"] = "Nome arma", + ["command_giveweapon_ammo"] = "Quantità munizioni", + ["command_giveweapon_hasalready"] = "Il giocatore ha già l'arma", + ["command_giveweaponcomponent"] = "Dai un componente arma ad un giocatore", + ["command_giveweaponcomponent_component"] = "Nome componente", + ["command_giveweaponcomponent_invalid"] = "Componente arma non valido", + ["command_giveweaponcomponent_hasalready"] = "Il giocatore ha già questo componente arma", + ["command_giveweaponcomponent_missingweapon"] = "Il giocatore non ha l'arma", + ["command_goto"] = "Teletrasportati da un giocatore", + ["command_kill"] = "Uccidi un giocatore", + ["command_save"] = "Salva forzatamente i dati di un giocatore", + ["command_saveall"] = "Salva forzatamente i dati di tutti igiocatoria", + ["command_setaccountmoney"] = "Aggiorna i soldi dentro un account specifico", + ["command_setaccountmoney_amount"] = "Quantità", + ["command_setcoords"] = "Teletrasportati a delle coordinate specifiche", + ["command_setcoords_x"] = "Valore X", + ["command_setcoords_y"] = "Valore Y", + ["command_setcoords_z"] = "Valore Z", + ["command_setjob"] = "Setta lavoro ad un giocatore", + ["command_setjob_job"] = "Nome", + ["command_setjob_grade"] = "Grado lavoro", + ["command_setjob_invalid"] = "Il lavoro, grado o entrambi sono errati", + ["command_setgroup"] = "Setta un gruppo di permessi ad un giocatore", + ["command_setgroup_group"] = "Nome del gruppo", + ["commanderror_argumentmismatch"] = "Conta argomenti non valida (passati %s, richiesti %s)", + ["commanderror_argumentmismatch_number"] = "Argomento #%s di tipologia errata (passato testo, richiesto numero)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Oggetto non valido", + ["commanderror_invalidweapon"] = "Arma non valida", + ["commanderror_console"] = "Comando non eseguibile dalla console", + ["commanderror_invalidcommand"] = "Comando non valido - /%s", + ["commanderror_invalidplayerid"] = "Il giocatore specificato non è online", + ["commandgeneric_playerid"] = "Id server del giocatore", + ["command_giveammo_noweapon_found"] = "%s non ha quell' arma", + ["command_giveammo_weapon"] = "Nome arma", + ["command_giveammo_ammo"] = "Quantità munizioni", + ["tpm_nowaypoint"] = "Nessuna meta impostata", + ["tpm_success"] = "Teletrasportato con successo", + + ["noclip_message"] = "Noclip %s", + ["enabled"] = "~g~abilitato~s~", + ["disabled"] = "~r~disabilitato~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "$%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "Pugnale Antico", + ["weapon_bat"] = "Mazza", + ["weapon_battleaxe"] = "Ascia", + ["weapon_bottle"] = "Bottiglia", + ["weapon_crowbar"] = "Piede di porco", + ["weapon_flashlight"] = "Torcia", + ["weapon_golfclub"] = "Mazza da golf", + ["weapon_hammer"] = "Martello", + ["weapon_hatchet"] = "Accetta", + ["weapon_knife"] = "Coltello", + ["weapon_knuckle"] = "Tirapugni", + ["weapon_machete"] = "Machete", + ["weapon_nightstick"] = "Manganello", + ["weapon_wrench"] = "Tubo", + ["weapon_poolcue"] = "Stecca", + ["weapon_stone_hatchet"] = "Accetta di pietra", + ["weapon_switchblade"] = "Coltello a serramanico", + + -- Handguns + ["weapon_appistol"] = "Pistola AP", + ["weapon_ceramicpistol"] = "Pistola di ceramica", + ["weapon_combatpistol"] = "Pistola da combattimento", + ["weapon_doubleaction"] = "Revolver doppia azione", + ["weapon_navyrevolver"] = "Revolver Marina", + ["weapon_flaregun"] = "Pistola lanciarazzi", + ["weapon_gadgetpistol"] = "Pistola Gadget", + ["weapon_heavypistol"] = "Pistola pesante", + ["weapon_revolver"] = "Revolver pesante", + ["weapon_revolver_mk2"] = "Revolver pesante MK2", + ["weapon_marksmanpistol"] = "Pistola da tiratore", + ["weapon_pistol"] = "Pistola", + ["weapon_pistol_mk2"] = "Pistola MK2", + ["weapon_pistol50"] = "Pistola .50", + ["weapon_snspistol"] = "Pistola SNS", + ["weapon_snspistol_mk2"] = "Pistola SNS MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizzatore", + ["weapon_vintagepistol"] = "Pistola Vintage", + + -- Shotguns + ["weapon_assaultshotgun"] = "Fucile a pompa d'assalto", + ["weapon_autoshotgun"] = "Fucile a pompa automatico", + ["weapon_bullpupshotgun"] = "Fucile a pompa Bullup", + ["weapon_combatshotgun"] = "Fucile a pompa da combattimento", + ["weapon_dbshotgun"] = "Fucile a pompa doppia canna", + ["weapon_heavyshotgun"] = "Fucile a pompa pesante", + ["weapon_musket"] = "Moschetto", + ["weapon_pumpshotgun"] = "Fucile a pompa", + ["weapon_pumpshotgun_mk2"] = "Fucile a pompa MK2", + ["weapon_sawnoffshotgun"] = "Fucile a canne mozza", + + -- SMG & LMG + ["weapon_assaultsmg"] = "SMG d'assalto", + ["weapon_combatmg"] = "MG da combattimento", + ["weapon_combatmg_mk2"] = "MG da combattimento MK2", + ["weapon_combatpdw"] = "PDW da combattimento", + ["weapon_gusenberg"] = "Mitragliatrice Gusenberg", + ["weapon_machinepistol"] = "Pistola mitragliatrice", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Hellbringer infernale", + + -- Rifles + ["weapon_advancedrifle"] = "Fucile avanzato", + ["weapon_assaultrifle"] = "Fucile d'assalto", + ["weapon_assaultrifle_mk2"] = "Fucile d' assalto MK2", + ["weapon_bullpuprifle"] = "Fucile Bullpup", + ["weapon_bullpuprifle_mk2"] = "Fucile Bullpup MK2", + ["weapon_carbinerifle"] = "Carabina", + ["weapon_carbinerifle_mk2"] = "Carbine MK2", + ["weapon_compactrifle"] = "Fucile compatto", + ["weapon_militaryrifle"] = "Fucile militare", + ["weapon_specialcarbine"] = "Carabina speciale", + ["weapon_specialcarbine_mk2"] = "Carabina speciale MK2", + ["weapon_heavyrifle"] = "Fucile pesante", + + -- Sniper + ["weapon_heavysniper"] = "Cecchino pesante", + ["weapon_heavysniper_mk2"] = "Cecchino pesante MK2", + ["weapon_marksmanrifle"] = "Fucile da tiratore", + ["weapon_marksmanrifle_mk2"] = "Fucile da tiratore MK2", + ["weapon_sniperrifle"] = "Cecchino", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Lanciagranate compatto", + ["weapon_firework"] = "Cannone pirotecnico", + ["weapon_grenadelauncher"] = "Lanciagranate", + ["weapon_hominglauncher"] = "Lanciarazzi a tracciamento", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Lanciarazzi", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metal Detector", + ["weapon_precisionrifle"] = "Fucile di precisione", + ["weapon_tactilerifle"] = "Carabina di servizio", + + -- Drug Wars DLC + ["weapon_candycane"] = "Bastoncino di zucchero", + ["weapon_acidpackage"] = "Pacco di acidi", + ["weapon_pistolxm3"] = "Pistola WM 29", + ["weapon_railgunxm3"] = "Railgun", + + -- Thrown + ["weapon_ball"] = "Palla", + ["weapon_bzgas"] = "BZ Gas", + ["weapon_flare"] = "Flare", + ["weapon_grenade"] = "Granata", + ["weapon_petrolcan"] = "Tanica", + ["weapon_hazardcan"] = "Tanica pericolosa", + ["weapon_molotov"] = "Molotov", + ["weapon_proxmine"] = "Mina di prossimità", + ["weapon_pipebomb"] = "Esplosivo plastico", + ["weapon_snowball"] = "Palla di neve", + ["weapon_stickybomb"] = "Bomba adesiva", + ["weapon_smokegrenade"] = "Gas lacrimogeno", + + -- Special + ["weapon_fireextinguisher"] = "Estintore", + ["weapon_digiscanner"] = "Scanner digitale", + ["weapon_garbagebag"] = "Sacco della spazzatura", + ["weapon_handcuffs"] = "Manette", + ["gadget_nightvision"] = "Visore termico", + ["gadget_parachute"] = "Paracadute", + + -- Weapon Components + ["component_knuckle_base"] = "Modello basa", + ["component_knuckle_pimp"] = "il Pappone", + ["component_knuckle_ballas"] = "i Ballas", + ["component_knuckle_dollar"] = "il Riccone", + ["component_knuckle_diamond"] = "la Roccia", + ["component_knuckle_hate"] = "l' Hater", + ["component_knuckle_love"] = "l' Amante", + ["component_knuckle_player"] = "il Giocatore", + ["component_knuckle_king"] = "il Re", + ["component_knuckle_vagos"] = "i Vagos", + + ["component_luxary_finish"] = "rifinitura di lusso", + + ["component_handle_default"] = "impugnatura base", + ["component_handle_vip"] = "impugnatura VIP", + ["component_handle_bodyguard"] = "impugnatura guardia del corpo", + + ["component_vip_finish"] = "rifinitura VIP", + ["component_bodyguard_finish"] = "rifinitura Guardia del corpo", + + ["component_camo_finish"] = "mimetica Digitale", + ["component_camo_finish2"] = "mimetica Cespuglio", + ["component_camo_finish3"] = "mimetica Legnosa", + ["component_camo_finish4"] = "mimetica Teschio", + ["component_camo_finish5"] = "mimetica Sessanta Nove", + ["component_camo_finish6"] = "mimetica Perseo", + ["component_camo_finish7"] = "mimetica Leopardata", + ["component_camo_finish8"] = "mimetica Zebra", + ["component_camo_finish9"] = "mimetica Geometrica", + ["component_camo_finish10"] = "mimetica Boom", + ["component_camo_finish11"] = "mimetica Patriottica", + + ["component_camo_slide_finish"] = "mimetica Digitale Slide", + ["component_camo_slide_finish2"] = "mimetica Cespuglio Slide", + ["component_camo_slide_finish3"] = "mimetica Legnosa Slide", + ["component_camo_slide_finish4"] = "mimetica Teschio Slide", + ["component_camo_slide_finish5"] = "mimetica Sessanta Nove Slide", + ["component_camo_slide_finish6"] = "mimetica Perseo Slide", + ["component_camo_slide_finish7"] = "mimetica Leopardata Slide", + ["component_camo_slide_finish8"] = "mimetica Zebra Slide", + ["component_camo_slide_finish9"] = "mimetica Geometrica Slide", + ["component_camo_slide_finish10"] = "mimetica Boom Slide", + ["component_camo_slide_finish11"] = "mimetica Patriottica Slide", + + ["component_clip_default"] = "caricatore Standard", + ["component_clip_extended"] = "caricatore Esteso", + ["component_clip_drum"] = "caricatore A Batteria", + ["component_clip_box"] = "caricatore A Scatola", + + ["component_scope_holo"] = "mirino Olografico", + ["component_scope_small"] = "mirino Piccolo", + ["component_scope_medium"] = "mirino Medio", + ["component_scope_large"] = "mirino Largo", + ["component_scope"] = "mirino Montato", + ["component_scope_advanced"] = "mirino Avanzato", + ["component_ironsights"] = "integrato", + + ["component_suppressor"] = "silenziatore", + ["component_compensator"] = "compensatore", + + ["component_muzzle_flat"] = "freno Di Bocca Piatto", + ["component_muzzle_tactical"] = "freno Di Bocca Tattico", + ["component_muzzle_fat"] = "freno Di Bocca Grosso", + ["component_muzzle_precision"] = "freno Di Bocca Di Precisione", + ["component_muzzle_heavy"] = "freno Di Bocca Pesante", + ["component_muzzle_slanted"] = "freno Di Bocca Inclinato", + ["component_muzzle_split"] = "freno Di Bocca Diviso", + ["component_muzzle_squared"] = "freno Di Bocca Quadrato", + + ["component_flashlight"] = "torcia", + ["component_grip"] = "impugnatura", + + ["component_barrel_default"] = "canna Standard", + ["component_barrel_heavy"] = "canna Pesante", + + ["component_ammo_tracer"] = "munizioni Traccianti", + ["component_ammo_incendiary"] = "munizioni Incendiarie", + ["component_ammo_hollowpoint"] = "munizioni a Punta Cava", + ["component_ammo_fmj"] = "munizioni fMj", + ["component_ammo_armor"] = "munizioni penetranti", + ["component_ammo_explosive"] = "munizioni penetranti incendiarie", + + ["component_shells_default"] = "cartucce Standard", + ["component_shells_incendiary"] = "cartucce alito di Drago", + ["component_shells_armor"] = "cartucce a pallettoni", + ["component_shells_hollowpoint"] = "cartucce a freccette", + ["component_shells_explosive"] = "cartucce esplosive", + + -- Weapon Ammo + ["ammo_rounds"] = "colpo(i)", + ["ammo_shells"] = "cartuccia(e)", + ["ammo_charge"] = "carica", + ["ammo_petrol"] = "Litri di carburante", + ["ammo_firework"] = "fuochi d'artificio", + ["ammo_rockets"] = "razzo(i)", + ["ammo_grenadelauncher"] = "granata(e)", + ["ammo_grenade"] = "granata(e)", + ["ammo_stickybomb"] = "bomba(e)", + ["ammo_pipebomb"] = "bomba(e)", + ["ammo_smokebomb"] = "bomba(e)", + ["ammo_molotov"] = "bottiglia(e)", + ["ammo_proxmine"] = "mina(e)", + ["ammo_bzgas"] = "latta(e)", + ["ammo_ball"] = "palla(e)", + ["ammo_snowball"] = "palle di neve", + ["ammo_flare"] = "razzo(i)", + ["ammo_flaregun"] = "razzo(i)", + + -- Weapon Tints + ["tint_default"] = "Colore standard", + ["tint_green"] = "color verde", + ["tint_gold"] = "color oro", + ["tint_pink"] = "color rosa", + ["tint_army"] = "color army", + ["tint_lspd"] = "color blu", + ["tint_orange"] = "color arancio", + ["tint_platinum"] = "color platino", +} diff --git a/server-data/resources/[esx]/es_extended/locales/nl.lua b/server-data/resources/[esx]/es_extended/locales/nl.lua index 3375b4ad8..5c4b55190 100644 --- a/server-data/resources/[esx]/es_extended/locales/nl.lua +++ b/server-data/resources/[esx]/es_extended/locales/nl.lua @@ -1,106 +1,124 @@ Locales["nl"] = { -- Inventory + ["inventory"] = "Inventaris ( Gewicht %s / %s )", + ["use"] = "Gebruik", + ["give"] = "Geef", + ["remove"] = "Gooi", + ["return"] = "Terug", + ["give_to"] = "Geef aan", + ["amount"] = "Aantal", ["giveammo"] = "Geef munitie", ["amountammo"] = "Hoeveelheid munitie", - ["noammo"] = "Niet genoeg!", - ["gave_item"] = "Geeft %sx %s aan %s", - ["received_item"] = "Ontvangen %sx %s van %s", - ["gave_weapon"] = "Geven %s aan %s", - ["gave_weapon_ammo"] = "Geeft ~o~%sx %s voor %s aan %s", - ["gave_weapon_withammo"] = "Geeft %s met ~o~%sx %s aan %s", + ["noammo"] = "Niet genoeg munitie!", + ["gave_item"] = "%sx %s gegeven aan %s", + ["received_item"] = "%sx %s ontvangen van %s", + ["gave_weapon"] = "%s gegeven aan %s", + ["gave_weapon_ammo"] = "~o~%sx %s gegeven voor een %s aan %s", + ["gave_weapon_withammo"] = "%s gegeven met ~o~%sx %s aan %s", ["gave_weapon_hasalready"] = "%s heeft al een %s", - ["gave_weapon_noweapon"] = "%s heeft geen wapen", - ["received_weapon"] = "%s gekregen van %s", - ["received_weapon_ammo"] = "Ontvangen ~o~%sx %s voor uw %s van %s", - ["received_weapon_withammo"] = "Ontvangen %s met ~o~%sx %s van %s", - ["received_weapon_hasalready"] = "%s heeft geprobeerd je een %s, te geven, maar je hebt dit wapen al", - ["received_weapon_noweapon"] = "%s heeft geprobeerd je munitie te geven voor een %s, maar je hebt dit wapen niet", - ["gave_account_money"] = "Geef $%s (%s) aan %s", - ["received_account_money"] = "Ontvangen $%s (%s) van %s", + ["gave_weapon_noweapon"] = "%s heeft dat wapen niet", + ["received_weapon"] = "%s ontvangen van %s", + ["received_weapon_ammo"] = "~o~%sx %s ontvangen voor je %s van %s", + ["received_weapon_withammo"] = "%s ontvangen met ~o~%sx %s van %s", + ["received_weapon_hasalready"] = "%s heeft geprobeerd je een %s te geven, maar je hebt dat wapen al.", + ["received_weapon_noweapon"] = "%s heeft geprobeerd je ammo te geven voor een %s, maar je hebt dit wapen niet", + ["gave_account_money"] = "€%s (%s) gegeven aan %s", + ["received_account_money"] = "€%s (%s) ontvangen van %s", ["amount_invalid"] = "Ongeldige hoeveelheid", ["players_nearby"] = "Geen spelers in de buurt", ["ex_inv_lim"] = "Kan actie niet uitvoeren, overschrijdt max. gewicht van %s", ["imp_invalid_quantity"] = "Kan actie niet uitvoeren, de hoeveelheid is ongeldig", - ["imp_invalid_amount"] = "Kan actie niet uitvoeren, het bedrag is ongeldig", - ["threw_standard"] = "Gooien %sx %s", - ["threw_account"] = "Gooien $%s %s", - ["threw_weapon"] = "Gooien %s", - ["threw_weapon_ammo"] = "Gooien %s met ~o~%sx %s", - ["threw_weapon_already"] = "Je hebt dit wapen al", - ["threw_cannot_pickup"] = "Inventaris is vol, kan niet worden opgehaald!", - ["threw_pickup_prompt"] = "Druk op E om op te halen", + ["imp_invalid_amount"] = "Kan actie niet uitvoeren, het aantal is ongeldig", + ["threw_standard"] = "%sx %s weggegooid", + ["threw_account"] = "€%s %s weggegooid", + ["threw_weapon"] = "%s weggegooid", + ["threw_weapon_ammo"] = "%s met ~o~%sx %s weggegooid", + ["threw_weapon_already"] = "Je hebt dit wapen al !", + ["threw_cannot_pickup"] = "Inventaris is vol, je kan dit niet oppakken!", + ["threw_pickup_prompt"] = "Druk op E om op te pakken", -- Key mapping - ["keymap_showinventory"] = "Toon inventaris", + ["keymap_showinventory"] = "Laat inventaris zien", -- Salary related - ["received_salary"] = "U bent betaald: $%s", - ["received_help"] = "U heeft uw bijstandsuitkering ontvangen: $%s", - ["company_nomoney"] = "het bedrijf waar u werkt is te arm om uw salaris uit te betalen", + ["received_salary"] = "Je bent betaald: €%s", + ["received_help"] = "Je hebt je uitkering gekregen: €%s", + ["company_nomoney"] = "Het bedrijf waar je bij werkt heeft te weinig geld om je uit te betalen.", ["received_paycheck"] = "salaris ontvangen", - ["bank"] = "Doolhofbank", + ["bank"] = "Maze Bank", ["account_bank"] = "Bank", ["account_black_money"] = "Zwart geld", - ["account_money"] = "Cash", + ["account_money"] = "Contant", ["act_imp"] = "Kan actie niet uitvoeren", - ["in_vehicle"] = "Kan actie niet uitvoeren, speler zit in voertuig", + ["in_vehicle"] = "Kan actie niet uitvoeren, de speler zit in een voertuig.", -- Commands - ["command_bring"] = "Breng speler naar je toe", + ["command_bring"] = "Breng speler naar jou", ["command_car"] = "Spawn een voertuig", - ["command_car_car"] = "Voertuigmodel of hash", - ["command_cardel"] = "Verwijder voertuigen in de buurt", - ["command_cardel_radius"] = "Verwijdert alle voertuigen binnen de opgegeven straal", - ["command_clear"] = "Chattekst wissen", - ["command_clearall"] = "Clear chattekst voor alle spelers", - ["command_clearinventory"] = "Verwijder alle items uit de spelersinventaris", - ["command_clearloadout"] = "Verwijder alle wapens uit de spelersuitrusting", - ["command_freeze"] = "Bevries een speler", - ["command_unfreeze"] = "Bevries een speler", - ["command_giveaccountmoney"] = "Geef geld aan een gespecificeerde rekening", + ["command_car_car"] = "Voertuig model of hash", + ["command_cardel"] = "Verwijder voertuigen in straal", + ["command_cardel_radius"] = "Verwijderd alle voertuigen in gewenste straal", + ["command_clear"] = "Verwijder chat berichten", + ["command_clearall"] = "Verwijder chat berichten voor alle spelers", + ["command_clearinventory"] = "Verwijder alle items van een speler zijn inventory", + ["command_clearloadout"] = "Verwijder alle wapens die een speler heeft", + ["command_freeze"] = "Freeze een speler", + ["command_unfreeze"] = "Unfreeze een speler", + ["command_giveaccountmoney"] = "Geef geld aan een rekening", ["command_giveaccountmoney_account"] = "Account om aan toe te voegen", - ["command_giveaccountmoney_amount"] = "Toe te voegen bedrag", - ["command_giveaccountmoney_invalid"] = "Accountnaam ongeldig", - ["command_giveitem"] = "Geef de speler een item", - ["command_giveitem_item"] = "Artikelnaam", - ["command_giveitem_count"] = "Aantal", - ["command_giveweapon"] = "Geef speler een wapen", - ["command_giveweapon_weapon"] = "Wapennaam", - ["command_giveweapon_ammo"] = "Hoeveelheid munitie", + ["command_giveaccountmoney_amount"] = "Bedrag om toe te voegen", + ["command_giveaccountmoney_invalid"] = "Account Naam ongeldig", + ["command_giveitem"] = "Geef speler een item", + ["command_giveitem_item"] = "Item naam", + ["command_giveitem_count"] = "Hoeveelheid", + ["command_giveweapon"] = "Geef de speler een wapen", + ["command_giveweapon_weapon"] = "Wapen naam", + ["command_giveweapon_ammo"] = "Munitie Hoeveelheid", ["command_giveweapon_hasalready"] = "Speler heeft dit wapen al", - ["command_giveweaponcomponent"] = "Geef wapencomponent aan speler", - ["command_giveweaponcomponent_component"] = "Componentnaam", - ["command_giveweaponcomponent_invalid"] = "Ongeldige wapencomponent", - ["command_giveweaponcomponent_hasalready"] = "Speler heeft deze wapencomponent al", - ["command_giveweaponcomponent_missingweapon"] = "Speler heeft dit wapen niet", + ["command_giveweaponcomponent"] = "Geef wapen component aan speler", + ["command_giveweaponcomponent_component"] = "Component naam", + ["command_giveweaponcomponent_invalid"] = "Ongeldig wapen component", + ["command_giveweaponcomponent_hasalready"] = "De speler heeft dit wapen component al", + ["command_giveweaponcomponent_missingweapon"] = "De speler heeft dit wapen niet", ["command_goto"] = "Teleporteer jezelf naar een speler", - ["command_save"] = "Geforceerd opslaan van spelersgegevens", - ["command_saveall"] = "Forceer alle spelersgegevens opslaan", - ["command_setaccountmoney"] = "Stel het geld in op een gespecificeerde rekening", - ["command_setaccountmoney_amount"] = "Bedrag", - ["command_setcoords"] = "Teleporteer naar opgegeven coördinaten", - ["command_setcoords_x"] = "X-waarde", - ["command_setcoords_y"] = "Y-waarde", - ["command_setcoords_z"] = "Z-waarde", - ["command_setjob"] = "Stel de taak van een speler in", + ["command_kill"] = "Vermoord een speler", + ["command_save"] = "Slaag een speler zijn spelerdata geforceerd op", + ["command_saveall"] = "Slaag iedereen zijn spelerdata geforceerd op", + ["command_setaccountmoney"] = "Stel geld in op een account", + ["command_setaccountmoney_amount"] = "Hoeveelheid", + ["command_setcoords"] = "Telepeer naar coordinaten", + ["command_setcoords_x"] = "X waarde", + ["command_setcoords_y"] = "Y waarde", + ["command_setcoords_z"] = "Z waarde", + ["command_setjob"] = "Zet een speler zijn / haar job", ["command_setjob_job"] = "Naam", - ["command_setjob_grade"] = "Functiecijfer", - ["command_setjob_invalid"] = "de baan, het cijfer of beide zijn ongeldig", + ["command_setjob_grade"] = "Job grade", + ["command_setjob_invalid"] = "De job, grade of beide zijn ongeldig", ["command_setgroup"] = "Stel een toestemmingsgroep voor spelers in", ["command_setgroup_group"] = "Naam van groep", ["commanderror_argumentmismatch"] = "Ongeldig aantal argumenten (geslaagd %s, gezocht %s)", ["commanderror_argumentmismatch_number"] = "Ongeldig argument #%s gegevenstype (doorgegeven string, gewenst nummer)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (doorgegeven string, gewenst nummer)", ["commanderror_invaliditem"] = "Ongeldig item", ["commanderror_invalidweapon"] = "Ongeldig wapen", - ["commanderror_console"] = "Opdracht kan niet worden uitgevoerd vanaf console", - ["commanderror_invalidcommand"] = "Ongeldige opdracht - /%s", + ["commanderror_console"] = "Command kan niet worden uitgevoerd vanaf console.", + ["commanderror_invalidcommand"] = "Ongeldig commando - /%s", ["commanderror_invalidplayerid"] = "Opgegeven speler is niet online", - ["commandgeneric_playerid"] = "Server-ID van de speler", + ["commandgeneric_playerid"] = "Speler server id", + ["command_giveammo_noweapon_found"] = "%s heeft dat wapen niet", + ["command_giveammo_weapon"] = "Wapen naam", + ["command_giveammo_ammo"] = "Munitie Hoeveelheid", + ["tpm_nowaypoint"] = "Geen navigatie ingesteld.", + ["tpm_success"] = "Successvol geteleporteerd", + + ["noclip_message"] = "Noclip is %s", + ["enabled"] = "~g~aangezet~s~", + ["disabled"] = "~r~uitgezet~s~", -- Locale settings ["locale_digit_grouping_symbol"] = ",", - ["locale_currency"] = "£%s", + ["locale_currency"] = "€%s", -- Weapons @@ -115,13 +133,13 @@ Locales["nl"] = { ["weapon_hammer"] = "Hamer", ["weapon_hatchet"] = "Bijl", ["weapon_knife"] = "Mes", - ["weapon_knuckle"] = "Knuckledusters", + ["weapon_knuckle"] = "Boksbeugel", ["weapon_machete"] = "Machete", - ["weapon_nightstick"] = "Nightstick", + ["weapon_nightstick"] = "Wapenstok", ["weapon_wrench"] = "Pijpsleutel", - ["weapon_poolcue"] = "Pool Cue", + ["weapon_poolcue"] = "Biljart Keu", ["weapon_stone_hatchet"] = "Steenbijl", - ["weapon_switchblade"] = "Switchblade", + ["weapon_switchblade"] = "Stiletto", -- Handguns ["weapon_appistol"] = "AP-pistool", @@ -129,7 +147,7 @@ Locales["nl"] = { ["weapon_combatpistol"] = "Gevechtspistool", ["weapon_doubleaction"] = "Revolver met dubbele actie", ["weapon_navyrevolver"] = "Marine Revolver", - ["weapon_flaregun"] = "Flaregun", + ["weapon_flaregun"] = "Noodsignaalpistool", ["weapon_gadgetpistol"] = "Gadgetpistool", ["weapon_heavypistol"] = "Zwaar pistool", ["weapon_revolver"] = "Zware revolver", @@ -159,8 +177,8 @@ Locales["nl"] = { -- SMG & LMG ["weapon_assaultsmg"] = "Aanval SMG", ["weapon_combatmg"] = "Gevecht MG", - ["weapon_combatmg_mk2"] = "Vecht tegen MG MK2", - ["weapon_combatpdw"] = "Vecht tegen PDW", + ["weapon_combatmg_mk2"] = "Combat MG MK2", + ["weapon_combatpdw"] = "Combat PDW", ["weapon_gusenberg"] = "Gusenberg-veger", ["weapon_machinepistol"] = "Machinepistool", ["weapon_mg"] = "MG", @@ -200,6 +218,17 @@ Locales["nl"] = { ["weapon_rpg"] = "Raketwerper", ["weapon_rayminigun"] = "Weduwemaker", + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metaal Detector", + ["weapon_precisionrifle"] = "Precisiegeweer", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug Wars DLC + ["weapon_candycane"] = "Snoep stok", + ["weapon_acidpackage"] = "LSD pakket", + ["weapon_pistolxm3"] = "WM 29 Pistool", + ["weapon_railgunxm3"] = "Railgun", + -- Thrown ["weapon_ball"] = "Honkbal", ["weapon_bzgas"] = "BZ-gas", @@ -267,10 +296,10 @@ Locales["nl"] = { ["component_camo_slide_finish10"] = "boom Slide camouflage", ["component_camo_slide_finish11"] = "patriottische diacamouflage", - ["component_clip_default"] = "standaard tijdschrift", - ["component_clip_extended"] = "uitgebreid tijdschrift", - ["component_clip_drum"] = "drummagazine", - ["component_clip_box"] = "doos Tijdschrift", + ["component_clip_default"] = "standaard magazijn", + ["component_clip_extended"] = "uitgebreid magazijn", + ["component_clip_drum"] = "drum magazijn", + ["component_clip_box"] = "box magazijn", ["component_scope_holo"] = "holografisch bereik", ["component_scope_small"] = "klein bereik", @@ -295,8 +324,8 @@ Locales["nl"] = { ["component_flashlight"] = "zaklamp", ["component_grip"] = "grip", - ["component_barrel_default"] = "standaard vat", - ["component_barrel_heavy"] = "zware vat", + ["component_barrel_default"] = "standaard handvat", + ["component_barrel_heavy"] = "zware handvat", ["component_ammo_tracer"] = "tracermunitie", ["component_ammo_incendiary"] = "brandgevaarlijke munitie", @@ -313,31 +342,31 @@ Locales["nl"] = { -- Weapon Ammo ["ammo_rounds"] = "ronde(n)", - ["ammo_shells"] = "shell(s)", + ["ammo_shells"] = "huls/(zen)", ["ammo_charge"] = "charge", ["ammo_petrol"] = "liters brandstof", - ["ammo_firework"] = "vuurwerk(en)", - ["ammo_rockets"] = "raket(en)", + ["ammo_firework"] = "vuurwerkpijl(en)", + ["ammo_rockets"] = "raket(ten)", ["ammo_grenadelauncher"] = "granaat(en)", ["ammo_grenade"] = "granaat(en)", - ["ammo_stickybomb"] = "bom(en)", - ["ammo_pipebomb"] = "bom(en)", - ["ammo_smokebomb"] = "bom(en)", + ["ammo_stickybomb"] = "bom(men)", + ["ammo_pipebomb"] = "bom(men)", + ["ammo_smokebomb"] = "bom(men)", ["ammo_molotov"] = "cocktail(s)", ["ammo_proxmine"] = "mijn(en)", ["ammo_bzgas"] = "blik(ken)", ["ammo_ball"] = "bal(len)", - ["ammo_snowball"] = "sneeuwbal(pen)", + ["ammo_snowball"] = "sneeuwbal(len)", ["ammo_flare"] = "flare(s)", ["ammo_flaregun"] = "flare(s)", -- Weapon Tints ["tint_default"] = "standaard skin", - ["tint_green"] = "groene huid", - ["tint_gold"] = "gouden huid", - ["tint_pink"] = "roze huid", - ["tint_army"] = "legerhuid", - ["tint_lspd"] = "blauwe huid", - ["tint_orange"] = "oranje huid", - ["tint_platinum"] = "platina huid", + ["tint_green"] = "groene skin", + ["tint_gold"] = "goude skin", + ["tint_pink"] = "roze skin", + ["tint_army"] = "legerprint", + ["tint_lspd"] = "blauwe skin", + ["tint_orange"] = "oranje skin", + ["tint_platinum"] = "platina skin", } diff --git a/server-data/resources/[esx]/es_extended/locales/pl.lua b/server-data/resources/[esx]/es_extended/locales/pl.lua index 5f61c94e1..de8b9ffd9 100644 --- a/server-data/resources/[esx]/es_extended/locales/pl.lua +++ b/server-data/resources/[esx]/es_extended/locales/pl.lua @@ -1,5 +1,12 @@ Locales["pl"] = { -- Inventory + ["inventory"] = "ekwipunek %s / %s", + ["use"] = "użyj", + ["give"] = "daj", + ["remove"] = "usuń", + ["return"] = "wróć", + ["give_to"] = "daj dla", + ["amount"] = "ilość", ["giveammo"] = "daj amunicje", ["amountammo"] = "ilość amunicji", ["noammo"] = "nie posiadasz wystarczającej ilości amunicji!", @@ -44,12 +51,16 @@ Locales["pl"] = { ["account_money"] = "pieniądze", ["act_imp"] = "działanie niemożliwe", ["in_vehicle"] = "nie możesz przekazywać przedmiotów w pojeździe", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", -- Commands ["command_car"] = "przywołaj pojazd", ["command_car_car"] = "nazwa lub hash przywołanego pojazdu", ["command_cardel"] = "usuń pojazd w pobliżu", ["command_cardel_radius"] = "opcjonalnie usuń każdy pojazd w obszarze", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", ["command_clear"] = "wyczyść czat", ["command_clearall"] = "wyczyść czat dla wszystkich graczy", ["command_clearinventory"] = "wyczyść ekwipunek gracza", @@ -86,12 +97,16 @@ Locales["pl"] = { ["command_setgroup_group"] = "nazwa grupy", ["commanderror_argumentmismatch"] = "nieprawiłowa ilość argumentów (przeszło %s, wymagane %s)", ["commanderror_argumentmismatch_number"] = "nieprawidłowy typ argumentu #%s (przeszedł tekst, wymagany numer)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", ["commanderror_invaliditem"] = "nieprawidłowa nazwa przedmiotu", ["commanderror_invalidweapon"] = "nieprawidłowa broń", ["commanderror_console"] = "podana komenda nie może zostać uruchomiona przez konsole", ["commanderror_invalidcommand"] = "/%s nie jest poprawną komendą!", ["commanderror_invalidplayerid"] = "brak dostepnego gracza pasującego do podanego id serwerowego", ["commandgeneric_playerid"] = "id gracza", + ["command_giveammo_noweapon_found"] = "%s does not have that weapon", + ["command_giveammo_weapon"] = "Weapon name", + ["command_giveammo_ammo"] = "Ammo Quantity", -- Locale settings ["locale_digit_grouping_symbol"] = ",", @@ -172,6 +187,7 @@ Locales["pl"] = { ["gadget_parachute"] = "spadochron", ["weapon_flare"] = "pistolet sygnałowy", ["weapon_doubleaction"] = "double-Action Revolver", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated -- Weapon Components ["component_clip_default"] = "domyślny tłumik", @@ -185,6 +201,12 @@ Locales["pl"] = { ["component_grip"] = "uchwyt", ["component_luxary_finish"] = "luksusowe wykończenie broni", + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + -- Weapon Ammo ["ammo_rounds"] = "nabój/oi", ["ammo_shells"] = "pocisk(ów)", diff --git a/server-data/resources/[esx]/es_extended/locales/sl.lua b/server-data/resources/[esx]/es_extended/locales/sl.lua new file mode 100644 index 000000000..f67a6bc57 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/sl.lua @@ -0,0 +1,377 @@ +Locales["sl"] = { + -- Inventory + ["inventory"] = "Shramba ( Teza %s / %s )", + ["use"] = "Uporabi", + ["give"] = "Daj", + ["remove"] = "Vrzi", + ["return"] = "Povratek", + ["give_to"] = "Daj", + ["amount"] = "Vsota", + ["giveammo"] = "Daj Strelivo", + ["amountammo"] = "Količina streliva", + ["noammo"] = "Ni dovolj!", + ["gave_item"] = "Dal si %sx %s k %s", + ["received_item"] = "Dobil si %sx %s od %s", + ["gave_weapon"] = "Dajanje %s do %s", + ["gave_weapon_ammo"] = "Dajanje ~o~%sx %s za %s do %s", + ["gave_weapon_withammo"] = "Dajanje %s z ~o~%sx %s do %s", + ["gave_weapon_hasalready"] = "%s ze ima %s", + ["gave_weapon_noweapon"] = "%s se nima tega orozja", + ["received_weapon"] = "Dobil si %s od %s", + ["received_weapon_ammo"] = "Dobil ~o~%sx %s za tvoj/o %s od %s", + ["received_weapon_withammo"] = "Dobil si %s z ~o~%sx %s od %s", + ["received_weapon_hasalready"] = "%s vam je poskušal dati %s, vendar že imate to orožje", + ["received_weapon_noweapon"] = "%s vam je poskušal dati strelivo za %s, vendar nimate tega orožja", + ["gave_account_money"] = "Dajanje $%s (%s) do %s", + ["received_account_money"] = "Dobil $%s (%s) od %s", + ["amount_invalid"] = "Neveljavna količina", + ["players_nearby"] = "V blizini ni ljudi", + ["ex_inv_lim"] = "Dejanja ni mogoče izvesti, saj presega največjo težo %s", + ["imp_invalid_quantity"] = "Dejanja ni mogoče izvesti, količina je neveljavna", + ["imp_invalid_amount"] = "Dejanja ni mogoče izvesti, znesek je neveljaven", + ["threw_standard"] = "Metanje %sx %s", + ["threw_account"] = "Metanje $%s %s", + ["threw_weapon"] = "Metanje %s", + ["threw_weapon_ammo"] = "Metanje %s z ~o~%sx %s", + ["threw_weapon_already"] = "Ti ze imas to orozje", + ["threw_cannot_pickup"] = "Shramba je poln, nemorem pobrati!", + ["threw_pickup_prompt"] = "Pritisni E da poberes", + + -- Key mapping + ["keymap_showinventory"] = "Pokazi Shrambo", + + -- Salary related + ["received_salary"] = "Vi ste plačali: $%s", + ["received_help"] = "Vi ste placali svoj CEK v vrednosti: $%s", + ["company_nomoney"] = "podjetje, v katerem ste zaposleni, je prerevno, da bi vam izplačevalo plačo", + ["received_paycheck"] = "Prejel si Placilo", + ["bank"] = "NLB", + ["account_bank"] = "Banka", + ["account_black_money"] = "Umazan Denar", + ["account_money"] = "Denar", + + ["act_imp"] = "Dejanja ni mogoče izvesti", + ["in_vehicle"] = "Dejanja ni mogoče izvesti, Oseba je v vozilu", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", + + -- Commands + ["command_bring"] = "Teleportiraj osebo do sebe", + ["command_car"] = "Spawnaj si vozilo", + ["command_car_car"] = "Koda vozila", + ["command_cardel"] = "Odstranite vozila v bližini", + ["command_cardel_radius"] = "Odstrani vsa vozila v določenem radiju", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", + ["command_clear"] = "Odstrani vsa sporocila v CHATU", + ["command_clearall"] = "Počisti besedilo klepeta za vse igralce", + ["command_clearinventory"] = "Vzemi vse stvari iz osebove shrambe", + ["command_clearloadout"] = "Odstranite vse orožje iz nalaganja igralcev", + ["command_freeze"] = "Zmrzni osebno", + ["command_unfreeze"] = "Odmrzni osebo", + ["command_giveaccountmoney"] = "Poslji denar na dolocen Bancni racun", + ["command_giveaccountmoney_account"] = "Račun za dodajanje", + ["command_giveaccountmoney_amount"] = "Znesek za dodajanje", + ["command_giveaccountmoney_invalid"] = "Ime računa je neveljavno", + ["command_giveitem"] = "Daj osebi neko stvar", + ["command_giveitem_item"] = "Ime Stvari", + ["command_giveitem_count"] = "Kolicina", + ["command_giveweapon"] = "Daj osebi orozje", + ["command_giveweapon_weapon"] = "Ime orozja", + ["command_giveweapon_ammo"] = "Kolicina", + ["command_giveweapon_hasalready"] = "Oseba ze ima to orozje!", + ["command_giveweaponcomponent"] = "Daj komponento orožja igralcu", + ["command_giveweaponcomponent_component"] = "Ime Komponente", + ["command_giveweaponcomponent_invalid"] = "Neveljavna komponenta orožja", + ["command_giveweaponcomponent_hasalready"] = "Oseba ze ima to komponento", + ["command_giveweaponcomponent_missingweapon"] = "Oseba nima tega orozja!", + ["command_goto"] = "Teleportirajte se k igralcu", + ["command_kill"] = "Ubij igralca", + ["command_save"] = "Prisilno shrani podatke igralca!", + ["command_saveall"] = "Prisilno shrani vse podatke igralca", + ["command_setaccountmoney"] = "Nastavite denar znotraj dolocenega racuna", + ["command_setaccountmoney_amount"] = "Znesek", + ["command_setcoords"] = "Teleport na dolocene koordinate", + ["command_setcoords_x"] = "Vrednost X", + ["command_setcoords_y"] = "Vrednost Y", + ["command_setcoords_z"] = "Z vrednost", + ["command_setjob"] = "Nastavi opravilo igralca", + ["command_setjob_job"] = "Ime", + ["command_setjob_grade"] = "Delovna ocena", + ["command_setjob_invalid"] = "delovno mesto, ocena ali oboje ni veljavno", + ["command_setgroup"] = "Nastavi skupino dovoljenj igralcev", + ["command_setgroup_group"] = "Ime skupine", + ["commanderror_argumentmismatch"] = "Neveljavno stetje argumentov (podano %s, zeleno %s)", + ["commanderror_argumentmismatch_number"] = "Neveljaven podatkovni tip argumenta #%s (posredovan niz, zeleno stevilo)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Neveljaven element", + ["commanderror_invalidweapon"] = "Neveljavno orozje", + ["commanderror_console"] = "Ukaza ni mogoce izvesti s konzole", + ["commanderror_invalidcommand"] = "Neveljaven ukaz - /%s", + ["commanderror_invalidplayerid"] = "Naveden igralec ni na spletu", + ["commandgeneric_playerid"] = "Id streznika igralca", + ["command_giveammo_noweapon_found"] = "%s nima tega orozja", + ["command_giveammo_weapon"] = "Ime orozja", + ["command_giveammo_ammo"] = "Kolicina streliva", + ["tpm_nowaypoint"] = "Ni nastavljene poti!.", + ["tpm_success"] = "Uspesno teleportiran", + + ["noclip_message"] = "Noclip je bil %s", + ["enabled"] = "~g~Vkljucen~s~", + ["disabled"] = "~r~Izkljucen~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "€%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "Dagger", + ["weapon_bat"] = "Bat", + ["weapon_battleaxe"] = "Battle Axe", + ["weapon_bottle"] = "Bottle", + ["weapon_crowbar"] = "Crowbar", + ["weapon_flashlight"] = "Flashlight", + ["weapon_golfclub"] = "Golf Club", + ["weapon_hammer"] = "Hammer", + ["weapon_hatchet"] = "Hatchet", + ["weapon_knife"] = "Knife", + ["weapon_knuckle"] = "Knuckledusters", + ["weapon_machete"] = "Machete", + ["weapon_nightstick"] = "Nightstick", + ["weapon_wrench"] = "Pipe Wrench", + ["weapon_poolcue"] = "Pool Cue", + ["weapon_stone_hatchet"] = "Stone Hatchet", + ["weapon_switchblade"] = "Switchblade", + + -- Handguns + ["weapon_appistol"] = "AP Pistol", + ["weapon_ceramicpistol"] = "Ceramic Pistol", + ["weapon_combatpistol"] = "Combat Pistol", + ["weapon_doubleaction"] = "Double-Action Revolver", + ["weapon_navyrevolver"] = "Navy Revolver", + ["weapon_flaregun"] = "Flaregun", + ["weapon_gadgetpistol"] = "Gadget Pistol", + ["weapon_heavypistol"] = "Heavy Pistol", + ["weapon_revolver"] = "Heavy Revolver", + ["weapon_revolver_mk2"] = "Heavy Revolver MK2", + ["weapon_marksmanpistol"] = "Marksman Pistol", + ["weapon_pistol"] = "Pistol", + ["weapon_pistol_mk2"] = "Pistol MK2", + ["weapon_pistol50"] = "Pistol .50", + ["weapon_snspistol"] = "SNS Pistol", + ["weapon_snspistol_mk2"] = "SNS Pistol MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Vintage Pistol", + + -- Shotguns + ["weapon_assaultshotgun"] = "Assault Shotgun", + ["weapon_autoshotgun"] = "Auto Shotgun", + ["weapon_bullpupshotgun"] = "Bullpup Shotgun", + ["weapon_combatshotgun"] = "Combat Shotgun", + ["weapon_dbshotgun"] = "Double Barrel Shotgun", + ["weapon_heavyshotgun"] = "Heavy Shotgun", + ["weapon_musket"] = "Musket", + ["weapon_pumpshotgun"] = "Pump Shotgun", + ["weapon_pumpshotgun_mk2"] = "Pump Shotgun MK2", + ["weapon_sawnoffshotgun"] = "Sawed Off Shotgun", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Assault SMG", + ["weapon_combatmg"] = "Combat MG", + ["weapon_combatmg_mk2"] = "Combat MG MK2", + ["weapon_combatpdw"] = "Combat PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Machine Pistol", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Unholy Hellbringer", + + -- Rifles + ["weapon_advancedrifle"] = "Advanced Rifle", + ["weapon_assaultrifle"] = "Assault Rifle", + ["weapon_assaultrifle_mk2"] = "Assault Rifle MK2", + ["weapon_bullpuprifle"] = "Bullpup Rifle", + ["weapon_bullpuprifle_mk2"] = "Bullpup Rifle MK2", + ["weapon_carbinerifle"] = "Carbine Rifle", + ["weapon_carbinerifle_mk2"] = "Carbine Rifle MK2", + ["weapon_compactrifle"] = "Compact Rifle", + ["weapon_militaryrifle"] = "Military Rifle", + ["weapon_specialcarbine"] = "Special Carbine", + ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated + + -- Sniper + ["weapon_heavysniper"] = "Heavy Sniper", + ["weapon_heavysniper_mk2"] = "Heavy Sniper MK2", + ["weapon_marksmanrifle"] = "Marksman Rifle", + ["weapon_marksmanrifle_mk2"] = "Marksman Rifle MK2", + ["weapon_sniperrifle"] = "Sniper Rifle", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Compact Launcher", + ["weapon_firework"] = "Firework Launcher", + ["weapon_grenadelauncher"] = "Grenade Launcher", + ["weapon_hominglauncher"] = "Homing Launcher", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Rocket Launcher", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metal Detector", + ["weapon_precisionrifle"] = "Precision Rifle", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + + -- Thrown + ["weapon_ball"] = "Baseball", + ["weapon_bzgas"] = "BZ Gas", + ["weapon_flare"] = "Flare", + ["weapon_grenade"] = "Grenade", + ["weapon_petrolcan"] = "Jerrycan", + ["weapon_hazardcan"] = "Hazardous Jerrycan", + ["weapon_molotov"] = "Molotov Cocktail", + ["weapon_proxmine"] = "Proximity Mine", + ["weapon_pipebomb"] = "Pipe Bomb", + ["weapon_snowball"] = "Snowball", + ["weapon_stickybomb"] = "Sticky Bomb", + ["weapon_smokegrenade"] = "Tear Gas", + + -- Special + ["weapon_fireextinguisher"] = "Fire Extinguisher", + ["weapon_digiscanner"] = "Digital Scanner", + ["weapon_garbagebag"] = "Garbage Bag", + ["weapon_handcuffs"] = "Handcuffs", + ["gadget_nightvision"] = "Night Vision", + ["gadget_parachute"] = "parachute", + + -- Weapon Components + ["component_knuckle_base"] = "base Model", + ["component_knuckle_pimp"] = "the Pimp", + ["component_knuckle_ballas"] = "the Ballas", + ["component_knuckle_dollar"] = "the Hustler", + ["component_knuckle_diamond"] = "the Rock", + ["component_knuckle_hate"] = "the Hater", + ["component_knuckle_love"] = "the Lover", + ["component_knuckle_player"] = "the Player", + ["component_knuckle_king"] = "the King", + ["component_knuckle_vagos"] = "the Vagos", + + ["component_luxary_finish"] = "luxary Weapon Finish", + + ["component_handle_default"] = "default Handle", + ["component_handle_vip"] = "vIP Handle", + ["component_handle_bodyguard"] = "bodyguard Handle", + + ["component_vip_finish"] = "vIP Finish", + ["component_bodyguard_finish"] = "bodyguard Finish", + + ["component_camo_finish"] = "digital Camo", + ["component_camo_finish2"] = "brushstroke Camo", + ["component_camo_finish3"] = "woodland Camo", + ["component_camo_finish4"] = "skull Camo", + ["component_camo_finish5"] = "sessanta Nove Camo", + ["component_camo_finish6"] = "perseus Camo", + ["component_camo_finish7"] = "leopard Camo", + ["component_camo_finish8"] = "zebra Camo", + ["component_camo_finish9"] = "geometric Camo", + ["component_camo_finish10"] = "boom Camo", + ["component_camo_finish11"] = "patriotic Camo", + + ["component_camo_slide_finish"] = "digital Slide Camo", + ["component_camo_slide_finish2"] = "brushstroke Slide Camo", + ["component_camo_slide_finish3"] = "woodland Slide Camo", + ["component_camo_slide_finish4"] = "skull Slide Camo", + ["component_camo_slide_finish5"] = "sessanta Nove Slide Camo", + ["component_camo_slide_finish6"] = "perseus Slide Camo", + ["component_camo_slide_finish7"] = "leopard Slide Camo", + ["component_camo_slide_finish8"] = "zebra Slide Camo", + ["component_camo_slide_finish9"] = "geometric Slide Camo", + ["component_camo_slide_finish10"] = "boom Slide Camo", + ["component_camo_slide_finish11"] = "patriotic Slide Camo", + + ["component_clip_default"] = "default Magazine", + ["component_clip_extended"] = "extended Magazine", + ["component_clip_drum"] = "drum Magazine", + ["component_clip_box"] = "box Magazine", + + ["component_scope_holo"] = "holographic Scope", + ["component_scope_small"] = "small Scope", + ["component_scope_medium"] = "medium Scope", + ["component_scope_large"] = "large Scope", + ["component_scope"] = "mounted Scope", + ["component_scope_advanced"] = "advanced Scope", + ["component_ironsights"] = "ironsights", + + ["component_suppressor"] = "suppressor", + ["component_compensator"] = "compensator", + + ["component_muzzle_flat"] = "flat Muzzle Brake", + ["component_muzzle_tactical"] = "tactical Muzzle Brake", + ["component_muzzle_fat"] = "fat-End Muzzle Brake", + ["component_muzzle_precision"] = "precision Muzzle Brake", + ["component_muzzle_heavy"] = "heavy Duty Muzzle Brake", + ["component_muzzle_slanted"] = "slanted Muzzle Brake", + ["component_muzzle_split"] = "split-End Muzzle Brake", + ["component_muzzle_squared"] = "squared Muzzle Brake", + + ["component_flashlight"] = "flashlight", + ["component_grip"] = "grip", + + ["component_barrel_default"] = "default Barrel", + ["component_barrel_heavy"] = "heavy Barrel", + + ["component_ammo_tracer"] = "tracer Ammo", + ["component_ammo_incendiary"] = "incendiary Ammo", + ["component_ammo_hollowpoint"] = "hollowpoint Ammo", + ["component_ammo_fmj"] = "fMJ Ammo", + ["component_ammo_armor"] = "armor Piercing Ammo", + ["component_ammo_explosive"] = "armor Piercing Incendiary Ammo", + + ["component_shells_default"] = "default Shells", + ["component_shells_incendiary"] = "dragons Breath Shells", + ["component_shells_armor"] = "steel Buckshot Shells", + ["component_shells_hollowpoint"] = "flechette Shells", + ["component_shells_explosive"] = "explosive Slug Shells", + + -- Weapon Ammo + ["ammo_rounds"] = "round(s)", + ["ammo_shells"] = "shell(s)", + ["ammo_charge"] = "charge", + ["ammo_petrol"] = "gallons of fuel", + ["ammo_firework"] = "firework(s)", + ["ammo_rockets"] = "rocket(s)", + ["ammo_grenadelauncher"] = "grenade(s)", + ["ammo_grenade"] = "grenade(s)", + ["ammo_stickybomb"] = "bomb(s)", + ["ammo_pipebomb"] = "bomb(s)", + ["ammo_smokebomb"] = "bomb(s)", + ["ammo_molotov"] = "cocktail(s)", + ["ammo_proxmine"] = "mine(s)", + ["ammo_bzgas"] = "can(s)", + ["ammo_ball"] = "ball(s)", + ["ammo_snowball"] = "snowball(s)", + ["ammo_flare"] = "flare(s)", + ["ammo_flaregun"] = "flare(s)", + + -- Weapon Tints + ["tint_default"] = "default skin", + ["tint_green"] = "green skin", + ["tint_gold"] = "gold skin", + ["tint_pink"] = "pink skin", + ["tint_army"] = "army skin", + ["tint_lspd"] = "blue skin", + ["tint_orange"] = "orange skin", + ["tint_platinum"] = "platinum skin", +} diff --git a/server-data/resources/[esx]/es_extended/locales/sr.lua b/server-data/resources/[esx]/es_extended/locales/sr.lua new file mode 100644 index 000000000..fd4a02515 --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/sr.lua @@ -0,0 +1,377 @@ +Locales["sr"] = { + -- Inventory + ["inventory"] = "Inventar ( Težina %s / %s )", + ["use"] = "Koristi", + ["give"] = "Daj", + ["remove"] = "Baci", + ["return"] = "Nazad", + ["give_to"] = "Daj", + ["amount"] = "Količina", + ["giveammo"] = "Daj municiju", + ["amountammo"] = "Količina municije", + ["noammo"] = "Nemate dovoljno!", + ["gave_item"] = "Davanje %sx %s igraču %s", + ["received_item"] = "Dobijeno %sx %s od %s", + ["gave_weapon"] = "Davanje %s igraču %s", + ["gave_weapon_ammo"] = "Davanje ~o~%sx %s za %s igraču %s", + ["gave_weapon_withammo"] = "Davanje %s sa ~o~%sx %s igraču %s", + ["gave_weapon_hasalready"] = "%s već ima %s", + ["gave_weapon_noweapon"] = "%s nema to oružje", + ["received_weapon"] = "Dobijeno %s od %s", + ["received_weapon_ammo"] = "Dobijeno ~o~%sx %s za vaš %s od %s", + ["received_weapon_withammo"] = "Dobijeno %s sa ~o~%sx %s od %s", + ["received_weapon_hasalready"] = "%s je pokušao da Vam da %s, ali vi već imate to oružje", + ["received_weapon_noweapon"] = "%s je pokušao da Vam da municiju za %s, ali vi nemate to oružje", + ["gave_account_money"] = "Davanje $%s (%s) igraču %s", + ["received_account_money"] = "Dobijeno $%s (%s) od %s", + ["amount_invalid"] = "Nevažeća količina", + ["players_nearby"] = "Nema igrača u blizini", + ["ex_inv_lim"] = "Ne možete uraditi to, premašuje max težinu od %s", + ["imp_invalid_quantity"] = "Nevažeća količina", + ["imp_invalid_amount"] = "Nevažeći iznos", + ["threw_standard"] = "Bacanje %sx %s", + ["threw_account"] = "Bacanje $%s %s", + ["threw_weapon"] = "Bacanje %s", + ["threw_weapon_ammo"] = "Bacanje %s sa ~o~%sx %s", + ["threw_weapon_already"] = "Vi već imate to oružje", + ["threw_cannot_pickup"] = "Inventar je pun, ne možete pokupiti to!", + ["threw_pickup_prompt"] = "Pritisni E da pokupiš", + + -- Key mapping + ["keymap_showinventory"] = "Otvaranje inventara", + + -- Salary related + ["received_salary"] = "Plaćeno Vam je: $%s", + ["received_help"] = "Isplaćen Vam je ček: $%s", + ["company_nomoney"] = "Kompanija u kojoj ste zapošljeni nema više novca", + ["received_paycheck"] = "primili ste platu", + ["bank"] = "Maze Banka", + ["account_bank"] = "Banka", + ["account_black_money"] = "Prljav novac", + ["account_money"] = "Novac", + + ["act_imp"] = "Ne možete izvršiti radnju", + ["in_vehicle"] = "Ne možete uraditi to dok je igrač u vozilu", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", + + -- Commands + ["command_bring"] = "TP-ajte igrača do Vas", + ["command_car"] = "Stvorite vozilo", + ["command_car_car"] = "Model ili hash vozila", + ["command_cardel"] = "Obrišite vozilo u blizini", + ["command_cardel_radius"] = "Obrišite sva vozila unutar navedenog radiusa", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", + ["command_clear"] = "Obrišite chat", + ["command_clearall"] = "Obrišite chat za sve igrače", + ["command_clearinventory"] = "Obrišite sve stvari iz inventara igrača", + ["command_clearloadout"] = "Obrišite sva oružja iz inventara igrača", + ["command_freeze"] = "Zaledite igrača", + ["command_unfreeze"] = "Odledite igrača", + ["command_giveaccountmoney"] = "Dajte novac na odredjeni nalog", + ["command_giveaccountmoney_account"] = "Nalog za slanje", + ["command_giveaccountmoney_amount"] = "Količina", + ["command_giveaccountmoney_invalid"] = "Nalog nepostojeći", + ["command_giveitem"] = "Dajte item igraču", + ["command_giveitem_item"] = "Ime item-a", + ["command_giveitem_count"] = "Količina", + ["command_giveweapon"] = "Dajte oružje igraču", + ["command_giveweapon_weapon"] = "Ime oružja", + ["command_giveweapon_ammo"] = "Količina municije", + ["command_giveweapon_hasalready"] = "Igrač već ima to oružje", + ["command_giveweaponcomponent"] = "Dajte dodatak za oružje igraču", + ["command_giveweaponcomponent_component"] = "Ime dodatka", + ["command_giveweaponcomponent_invalid"] = "Nevažeći dodatak", + ["command_giveweaponcomponent_hasalready"] = "Igrač već ima taj dodatak", + ["command_giveweaponcomponent_missingweapon"] = "Igrač nema oružje", + ["command_goto"] = "Idite do igrača", + ["command_kill"] = "Ubijte igrača", + ["command_save"] = "Forsirajte čuvanje date igrača", + ["command_saveall"] = "Forsirajte čuvanje date svih igrača", + ["command_setaccountmoney"] = "Postavite novac na određeni račun", + ["command_setaccountmoney_amount"] = "Količina", + ["command_setcoords"] = "Teleportujte se na koordinate", + ["command_setcoords_x"] = "X", + ["command_setcoords_y"] = "Y", + ["command_setcoords_z"] = "Z", + ["command_setjob"] = "Postavite posao igraču", + ["command_setjob_job"] = "Ime", + ["command_setjob_grade"] = "Stepen posla", + ["command_setjob_invalid"] = "posao, stepen ili oba nisu validna", + ["command_setgroup"] = "Postavite permisiju", + ["command_setgroup_group"] = "Ime grupe", + ["commanderror_argumentmismatch"] = "Nevazeci broj argumenata (položio %s, željeno %s)", + ["commanderror_argumentmismatch_number"] = "Nevažeći argument #%s tip podataka (položeno, željeno)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Nevažeći item", + ["commanderror_invalidweapon"] = "Nevažeće oružje", + ["commanderror_console"] = "Komanda se ne može izvršiti iz konzole", + ["commanderror_invalidcommand"] = "Nevažeća komanda - /%s", + ["commanderror_invalidplayerid"] = "Igrač nije online", + ["commandgeneric_playerid"] = "Igračev server ID", + ["command_giveammo_noweapon_found"] = "%s nema to oružje", + ["command_giveammo_weapon"] = "Ime oružja", + ["command_giveammo_ammo"] = "Količina municije", + ["tpm_nowaypoint"] = "Morate označiti lokaciju.", + ["tpm_success"] = "Teleportovani ste na lokaciju", + + ["noclip_message"] = "Noclip %s", + ["enabled"] = "~g~upaljen~s~", + ["disabled"] = "~r~ugašen~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "£%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "Dagger", + ["weapon_bat"] = "Bat", + ["weapon_battleaxe"] = "Battle Axe", + ["weapon_bottle"] = "Bottle", + ["weapon_crowbar"] = "Crowbar", + ["weapon_flashlight"] = "Flashlight", + ["weapon_golfclub"] = "Golf Club", + ["weapon_hammer"] = "Hammer", + ["weapon_hatchet"] = "Hatchet", + ["weapon_knife"] = "Knife", + ["weapon_knuckle"] = "Knuckledusters", + ["weapon_machete"] = "Machete", + ["weapon_nightstick"] = "Nightstick", + ["weapon_wrench"] = "Pipe Wrench", + ["weapon_poolcue"] = "Pool Cue", + ["weapon_stone_hatchet"] = "Stone Hatchet", + ["weapon_switchblade"] = "Switchblade", + + -- Handguns + ["weapon_appistol"] = "AP Pistol", + ["weapon_ceramicpistol"] = "Ceramic Pistol", + ["weapon_combatpistol"] = "Combat Pistol", + ["weapon_doubleaction"] = "Double-Action Revolver", + ["weapon_navyrevolver"] = "Navy Revolver", + ["weapon_flaregun"] = "Flaregun", + ["weapon_gadgetpistol"] = "Gadget Pistol", + ["weapon_heavypistol"] = "Heavy Pistol", + ["weapon_revolver"] = "Heavy Revolver", + ["weapon_revolver_mk2"] = "Heavy Revolver MK2", + ["weapon_marksmanpistol"] = "Marksman Pistol", + ["weapon_pistol"] = "Pistol", + ["weapon_pistol_mk2"] = "Pistol MK2", + ["weapon_pistol50"] = "Pistol .50", + ["weapon_snspistol"] = "SNS Pistol", + ["weapon_snspistol_mk2"] = "SNS Pistol MK2", + ["weapon_stungun"] = "Taser", + ["weapon_raypistol"] = "Up-N-Atomizer", + ["weapon_vintagepistol"] = "Vintage Pistol", + + -- Shotguns + ["weapon_assaultshotgun"] = "Assault Shotgun", + ["weapon_autoshotgun"] = "Auto Shotgun", + ["weapon_bullpupshotgun"] = "Bullpup Shotgun", + ["weapon_combatshotgun"] = "Combat Shotgun", + ["weapon_dbshotgun"] = "Double Barrel Shotgun", + ["weapon_heavyshotgun"] = "Heavy Shotgun", + ["weapon_musket"] = "Musket", + ["weapon_pumpshotgun"] = "Pump Shotgun", + ["weapon_pumpshotgun_mk2"] = "Pump Shotgun MK2", + ["weapon_sawnoffshotgun"] = "Sawed Off Shotgun", + + -- SMG & LMG + ["weapon_assaultsmg"] = "Assault SMG", + ["weapon_combatmg"] = "Combat MG", + ["weapon_combatmg_mk2"] = "Combat MG MK2", + ["weapon_combatpdw"] = "Combat PDW", + ["weapon_gusenberg"] = "Gusenberg Sweeper", + ["weapon_machinepistol"] = "Machine Pistol", + ["weapon_mg"] = "MG", + ["weapon_microsmg"] = "Micro SMG", + ["weapon_minismg"] = "Mini SMG", + ["weapon_smg"] = "SMG", + ["weapon_smg_mk2"] = "SMG MK2", + ["weapon_raycarbine"] = "Unholy Hellbringer", + + -- Rifles + ["weapon_advancedrifle"] = "Advanced Rifle", + ["weapon_assaultrifle"] = "Assault Rifle", + ["weapon_assaultrifle_mk2"] = "Assault Rifle MK2", + ["weapon_bullpuprifle"] = "Bullpup Rifle", + ["weapon_bullpuprifle_mk2"] = "Bullpup Rifle MK2", + ["weapon_carbinerifle"] = "Carbine Rifle", + ["weapon_carbinerifle_mk2"] = "Carbine Rifle MK2", + ["weapon_compactrifle"] = "Compact Rifle", + ["weapon_militaryrifle"] = "Military Rifle", + ["weapon_specialcarbine"] = "Special Carbine", + ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated + + -- Sniper + ["weapon_heavysniper"] = "Heavy Sniper", + ["weapon_heavysniper_mk2"] = "Heavy Sniper MK2", + ["weapon_marksmanrifle"] = "Marksman Rifle", + ["weapon_marksmanrifle_mk2"] = "Marksman Rifle MK2", + ["weapon_sniperrifle"] = "Sniper Rifle", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "Compact Launcher", + ["weapon_firework"] = "Firework Launcher", + ["weapon_grenadelauncher"] = "Grenade Launcher", + ["weapon_hominglauncher"] = "Homing Launcher", + ["weapon_minigun"] = "Minigun", + ["weapon_railgun"] = "Railgun", + ["weapon_rpg"] = "Rocket Launcher", + ["weapon_rayminigun"] = "Widowmaker", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metal Detector", + ["weapon_precisionrifle"] = "Precision Rifle", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + + -- Thrown + ["weapon_ball"] = "Baseball", + ["weapon_bzgas"] = "BZ Gas", + ["weapon_flare"] = "Flare", + ["weapon_grenade"] = "Grenade", + ["weapon_petrolcan"] = "Jerrycan", + ["weapon_hazardcan"] = "Hazardous Jerrycan", + ["weapon_molotov"] = "Molotov Cocktail", + ["weapon_proxmine"] = "Proximity Mine", + ["weapon_pipebomb"] = "Pipe Bomb", + ["weapon_snowball"] = "Snowball", + ["weapon_stickybomb"] = "Sticky Bomb", + ["weapon_smokegrenade"] = "Tear Gas", + + -- Special + ["weapon_fireextinguisher"] = "Fire Extinguisher", + ["weapon_digiscanner"] = "Digital Scanner", + ["weapon_garbagebag"] = "Garbage Bag", + ["weapon_handcuffs"] = "Handcuffs", + ["gadget_nightvision"] = "Night Vision", + ["gadget_parachute"] = "parachute", + + -- Weapon Components + ["component_knuckle_base"] = "base Model", + ["component_knuckle_pimp"] = "the Pimp", + ["component_knuckle_ballas"] = "the Ballas", + ["component_knuckle_dollar"] = "the Hustler", + ["component_knuckle_diamond"] = "the Rock", + ["component_knuckle_hate"] = "the Hater", + ["component_knuckle_love"] = "the Lover", + ["component_knuckle_player"] = "the Player", + ["component_knuckle_king"] = "the King", + ["component_knuckle_vagos"] = "the Vagos", + + ["component_luxary_finish"] = "luxary Weapon Finish", + + ["component_handle_default"] = "default Handle", + ["component_handle_vip"] = "vIP Handle", + ["component_handle_bodyguard"] = "bodyguard Handle", + + ["component_vip_finish"] = "vIP Finish", + ["component_bodyguard_finish"] = "bodyguard Finish", + + ["component_camo_finish"] = "digital Camo", + ["component_camo_finish2"] = "brushstroke Camo", + ["component_camo_finish3"] = "woodland Camo", + ["component_camo_finish4"] = "skull Camo", + ["component_camo_finish5"] = "sessanta Nove Camo", + ["component_camo_finish6"] = "perseus Camo", + ["component_camo_finish7"] = "leopard Camo", + ["component_camo_finish8"] = "zebra Camo", + ["component_camo_finish9"] = "geometric Camo", + ["component_camo_finish10"] = "boom Camo", + ["component_camo_finish11"] = "patriotic Camo", + + ["component_camo_slide_finish"] = "digital Slide Camo", + ["component_camo_slide_finish2"] = "brushstroke Slide Camo", + ["component_camo_slide_finish3"] = "woodland Slide Camo", + ["component_camo_slide_finish4"] = "skull Slide Camo", + ["component_camo_slide_finish5"] = "sessanta Nove Slide Camo", + ["component_camo_slide_finish6"] = "perseus Slide Camo", + ["component_camo_slide_finish7"] = "leopard Slide Camo", + ["component_camo_slide_finish8"] = "zebra Slide Camo", + ["component_camo_slide_finish9"] = "geometric Slide Camo", + ["component_camo_slide_finish10"] = "boom Slide Camo", + ["component_camo_slide_finish11"] = "patriotic Slide Camo", + + ["component_clip_default"] = "default Magazine", + ["component_clip_extended"] = "extended Magazine", + ["component_clip_drum"] = "drum Magazine", + ["component_clip_box"] = "box Magazine", + + ["component_scope_holo"] = "holographic Scope", + ["component_scope_small"] = "small Scope", + ["component_scope_medium"] = "medium Scope", + ["component_scope_large"] = "large Scope", + ["component_scope"] = "mounted Scope", + ["component_scope_advanced"] = "advanced Scope", + ["component_ironsights"] = "ironsights", + + ["component_suppressor"] = "suppressor", + ["component_compensator"] = "compensator", + + ["component_muzzle_flat"] = "flat Muzzle Brake", + ["component_muzzle_tactical"] = "tactical Muzzle Brake", + ["component_muzzle_fat"] = "fat-End Muzzle Brake", + ["component_muzzle_precision"] = "precision Muzzle Brake", + ["component_muzzle_heavy"] = "heavy Duty Muzzle Brake", + ["component_muzzle_slanted"] = "slanted Muzzle Brake", + ["component_muzzle_split"] = "split-End Muzzle Brake", + ["component_muzzle_squared"] = "squared Muzzle Brake", + + ["component_flashlight"] = "flashlight", + ["component_grip"] = "grip", + + ["component_barrel_default"] = "default Barrel", + ["component_barrel_heavy"] = "heavy Barrel", + + ["component_ammo_tracer"] = "tracer Ammo", + ["component_ammo_incendiary"] = "incendiary Ammo", + ["component_ammo_hollowpoint"] = "hollowpoint Ammo", + ["component_ammo_fmj"] = "fMJ Ammo", + ["component_ammo_armor"] = "armor Piercing Ammo", + ["component_ammo_explosive"] = "armor Piercing Incendiary Ammo", + + ["component_shells_default"] = "default Shells", + ["component_shells_incendiary"] = "dragons Breath Shells", + ["component_shells_armor"] = "steel Buckshot Shells", + ["component_shells_hollowpoint"] = "flechette Shells", + ["component_shells_explosive"] = "explosive Slug Shells", + + -- Weapon Ammo + ["ammo_rounds"] = "round(s)", + ["ammo_shells"] = "shell(s)", + ["ammo_charge"] = "charge", + ["ammo_petrol"] = "gallons of fuel", + ["ammo_firework"] = "firework(s)", + ["ammo_rockets"] = "rocket(s)", + ["ammo_grenadelauncher"] = "grenade(s)", + ["ammo_grenade"] = "grenade(s)", + ["ammo_stickybomb"] = "bomb(s)", + ["ammo_pipebomb"] = "bomb(s)", + ["ammo_smokebomb"] = "bomb(s)", + ["ammo_molotov"] = "cocktail(s)", + ["ammo_proxmine"] = "mine(s)", + ["ammo_bzgas"] = "can(s)", + ["ammo_ball"] = "ball(s)", + ["ammo_snowball"] = "snowball(s)", + ["ammo_flare"] = "flare(s)", + ["ammo_flaregun"] = "flare(s)", + + -- Weapon Tints + ["tint_default"] = "default skin", + ["tint_green"] = "green skin", + ["tint_gold"] = "gold skin", + ["tint_pink"] = "pink skin", + ["tint_army"] = "army skin", + ["tint_lspd"] = "blue skin", + ["tint_orange"] = "orange skin", + ["tint_platinum"] = "platinum skin", +} diff --git a/server-data/resources/[esx]/es_extended/locales/sv.lua b/server-data/resources/[esx]/es_extended/locales/sv.lua index 2c2880b68..633b3227c 100644 --- a/server-data/resources/[esx]/es_extended/locales/sv.lua +++ b/server-data/resources/[esx]/es_extended/locales/sv.lua @@ -1,110 +1,140 @@ Locales["sv"] = { -- Inventory - ["giveammo"] = "Ge ammunition", - ["amountammo"] = "Mängd ammunition", - ["noammo"] = "Inte tillräckligt med ammunition!", - ["gave_item"] = "Ge %sx %s till %s", - ["received_item"] = "Fick %sx %s från %s", - ["gave_weapon"] = "Ge %s till %s", - ["gave_weapon_ammo"] = "Ge ~o~%sx %s för %s till %s", - ["gave_weapon_withammo"] = "Ge %s med ~o~%sx %s till %s", + ["inventory"] = "Inventory ( Vikt %s / %s )", + ["use"] = "Använd", + ["give"] = "Ge", + ["remove"] = "Kasta", + ["return"] = "Tillbaka", + ["give_to"] = "Ge", + ["amount"] = "Antal", + ["giveammo"] = "Ge skott", + ["amountammo"] = "Antal skott", + ["noammo"] = "Inte tillräckligt!", + ["gave_item"] = "Ger %sx %s till %s", + ["received_item"] = "Mottog %sx %s från %s", + ["gave_weapon"] = "Ger %s till %s", + ["gave_weapon_ammo"] = "Ger ~o~%sx %s för %s till %s", + ["gave_weapon_withammo"] = "Ger %s med ~o~%sx %s till %s", ["gave_weapon_hasalready"] = "%s har redan en %s", - ["gave_weapon_noweapon"] = "%s har inte det vapnet", + ["gave_weapon_noweapon"] = "%s har inte detta vapen", ["received_weapon"] = "Mottog %s från %s", - ["received_weapon_ammo"] = "Fick ~o~%sx %s för din %s från %s", + ["received_weapon_ammo"] = "Mottog ~o~%sx %s för din %s från %s", ["received_weapon_withammo"] = "Mottog %s med ~o~%sx %s från %s", - ["received_weapon_hasalready"] = "%s har försökt ge dig en %s, men du har redan det här vapnet", - ["received_weapon_noweapon"] = "%s har försökt ge dig ammunition för en %s, men du har inte det här vapnet", - ["gave_account_money"] = "Ge $%s (%s) till %s", - ["received_account_money"] = "Mottog $%s (%s) från %s", + ["received_weapon_hasalready"] = "%s har försökt ge dig en %s, men du har redan detta", + ["received_weapon_noweapon"] = "%s har försökt ge dig skott till en %s, men du har inte detta vapen", + ["gave_account_money"] = "Ger %skr (%s) till %s", + ["received_account_money"] = "Mottog %skr (%s) från %s", ["amount_invalid"] = "Ogiltig mängd", - ["players_nearby"] = "Inga spelare i närheten", - ["ex_inv_lim"] = "Kan inte utföra åtgärden, överstiger maxvikten %s", - ["imp_invalid_quantity"] = "Det går inte att utföra åtgärden, mängden är ogiltig", - ["imp_invalid_amount"] = "Det går inte att utföra åtgärden, mängden är ogiltigt", - ["threw_standard"] = "Kastade %sx %s", - ["threw_account"] = "Kastade $%s %s", - ["threw_weapon"] = "Kastade %s", - ["threw_weapon_ammo"] = "Kastade %s med ~o~%sx %s", - ["threw_weapon_already"] = "Du har redan det här vapnet", - ["threw_cannot_pickup"] = "Förrådet är fullt, kan inte plocka upp!", + ["players_nearby"] = "Inga spelare nära", + ["ex_inv_lim"] = "Kan inte utföra, överskrider maxvikten på %s", + ["imp_invalid_quantity"] = "Kan inte utföra, mängden är ogiltig", + ["imp_invalid_amount"] = "Kan inte utföra, antalet är ogiltig", + ["threw_standard"] = "Kastar %sx %s", + ["threw_account"] = "Kastar %skr %s", + ["threw_weapon"] = "Kastar %s", + ["threw_weapon_ammo"] = "Kastar %s med ~o~%sx %s", + ["threw_weapon_already"] = "Du har redan detta vapen", + ["threw_cannot_pickup"] = "Inventoryt är fullt, kan inte plocka upp!", ["threw_pickup_prompt"] = "Tryck E för att plocka upp", -- Key mapping - ["keymap_showinventory"] = "Visa förrådet", + ["keymap_showinventory"] = "Öppna inventory", -- Salary related - ["received_salary"] = "Du har fått lön: $%s", - ["received_help"] = "Du har fått bidrag: $%s", - ["company_nomoney"] = "företaget du är anställt hos har inte råd att betala ut din lön", - ["received_paycheck"] = "Mottagit lön", - ["bank"] = "Bank", + ["received_salary"] = "Du har fått ditt bidrag: %skr", + ["received_help"] = "Du har fått betalt: %skr", + ["company_nomoney"] = "Företaget du är anställd hos har inte råd med att betala ut lön", + ["received_paycheck"] = "Mottog lön", + ["bank"] = "Maze Bank", ["account_bank"] = "Bank", ["account_black_money"] = "Svarta pengar", ["account_money"] = "Kontanter", - ["act_imp"] = "Kan inte utföra åtgärd", - ["in_vehicle"] = "Kan inte utföra åtgärd, spelaren är i ett fordon", + ["act_imp"] = "Kan inte utföra", + ["in_vehicle"] = "Kan inte utföra, spelaren är i ett fordon", + ["not_in_vehicle"] = "Kan inte utföra, spelaren är inte i ett fordon", -- Commands - ["command_car"] = "Spawna ett fordon", - ["command_car_car"] = "Fordonsmodell eller hash", - ["command_cardel"] = "Ta bort fordon i närheten", - ["command_cardel_radius"] = "Tar bort alla fordon inom angiven radie", - ["command_clear"] = "Rensa chatttext", - ["command_clearall"] = "Rensa chatttext för alla spelare", - ["command_clearinventory"] = "Ta bort alla föremål från spelarens förråd", - ["command_clearloadout"] = "Ta bort alla vapen från spelarens förråd", + ["command_bring"] = "Ta en spelare till dig", + ["command_car"] = "Ta fram ett fordon", + ["command_car_car"] = "modell", + ["command_cardel"] = "Raderar fordon inom en specifik radie", + ["command_cardel_radius"] = "Raderar fordon inom en specifik radie", + ["command_repair"] = "Reparera ditt fordon", + ["command_repair_success"] = "Fordon reparerat", + ["command_repair_success_target"] = "En admin har reparerat ditt fordon", + ["command_clear"] = "Rensa chatt", + ["command_clearall"] = "Rensa chatt för alla", + ["command_clearinventory"] = "Raderar alla föremål från en spelares inventory", + ["command_clearloadout"] = "Raderar alla vapen från en spelares inventory", + ["command_freeze"] = "Frys en spelare", + ["command_unfreeze"] = "Ta bort frysningen från en spelare", ["command_giveaccountmoney"] = "Ge pengar till ett specifikt konto", - ["command_giveaccountmoney_account"] = "Konto att lägga till i", - ["command_giveaccountmoney_amount"] = "Belopp att lägga till", - ["command_giveaccountmoney_invalid"] = "Kontonamn ogiltigt", - ["command_giveitem"] = "Ge spelaren ett föremål", - ["command_giveitem_item"] = "Föremålsnamn", - ["command_giveitem_count"] = "Mängd", - ["command_giveweapon"] = "Ge spelaren ett vapen", - ["command_giveweapon_weapon"] = "Vapennamn", - ["command_giveweapon_ammo"] = "Ammunitionsmängd", - ["command_giveweapon_hasalready"] = "Spelaren har redan det här vapnet", - ["command_giveweaponcomponent"] = "Ge en vapenkomponent till spelaren", - ["command_giveweaponcomponent_component"] = "Vapenkomponentnamn", - ["command_giveweaponcomponent_invalid"] = "Ogiltig vapenkomponent", - ["command_giveweaponcomponent_hasalready"] = "Spelaren har redan denna vapenkomponent", - ["command_giveweaponcomponent_missingweapon"] = "Spelaren har inte det här vapnet", - ["command_save"] = "Tvångspara en spelares data", - ["command_saveall"] = "Tvångspara allas spelardata", - ["command_setaccountmoney"] = "Ställ in pengarna på ett angivet konto", - ["command_setaccountmoney_amount"] = "Ny Summa", - ["command_setcoords"] = "Teleportera till specificerade koordinater", - ["command_setcoords_x"] = "X-värde", - ["command_setcoords_y"] = "Y-värde", - ["command_setcoords_z"] = "Z-värde", - ["command_setjob"] = "Ställ in en spelares jobb", - ["command_setjob_job"] = "Jobbnamn", - ["command_setjob_grade"] = "Jobbnivå", - ["command_setjob_invalid"] = "jobbet, nivån eller båda är ogiltiga", - ["command_setgroup"] = "Ställ in en spelares behörighetsgrupp", - ["command_setgroup_group"] = "Gruppens namn", - ["commanderror_argumentmismatch"] = "Ogiltigt antal argument (godkänt %s, önskat %s)", - ["commanderror_argumentmismatch_number"] = "Ogiltigt argument #%s datatyp (godkänd sträng, önskat nummer)", - ["commanderror_invaliditem"] = "Ogiltig artikel", + ["command_giveaccountmoney_account"] = "Konto", + ["command_giveaccountmoney_amount"] = "Summa", + ["command_giveaccountmoney_invalid"] = "Ogiltigt kontonamn", + ["command_removeaccountmoney"] = "Radera pengar från ett specifikt konto", + ["command_removeaccountmoney_account"] = "Konto", + ["command_removeaccountmoney_amount"] = "Summa", + ["command_removeaccountmoney_invalid"] = "Ogiltigt kontonamn", + ["command_giveitem"] = "Ge föremål till en spelare", + ["command_giveitem_item"] = "Namn", + ["command_giveitem_count"] = "Antal", + ["command_giveweapon"] = "Ge ett vapen till en spelare", + ["command_giveweapon_weapon"] = "Vapen", + ["command_giveweapon_ammo"] = "Antal skott", + ["command_giveweapon_hasalready"] = "Spelaren har redan detta vapen", + ["command_giveweaponcomponent"] = "Ge komponent till en spelare", + ["command_giveweaponcomponent_component"] = "Komponent", + ["command_giveweaponcomponent_invalid"] = "Ogiltig komponent", + ["command_giveweaponcomponent_hasalready"] = "Spelaren har redan denna komponent", + ["command_giveweaponcomponent_missingweapon"] = "Spelaren har inte vapen för komponenten", + ["command_goto"] = "Teleportera till en spelare", + ["command_kill"] = "Döda en spelare", + ["command_save"] = "Spara en spelares data", + ["command_saveall"] = "Spara alla spelares data", + ["command_setaccountmoney"] = "Sätt pengar på ett specifikt konto", + ["command_setaccountmoney_amount"] = "Summa", + ["command_setcoords"] = "Teleportera till koordinater", + ["command_setcoords_x"] = "X value", + ["command_setcoords_y"] = "Y value", + ["command_setcoords_z"] = "Z value", + ["command_setjob"] = "Sätt jobb för en spelare", + ["command_setjob_job"] = "Namn", + ["command_setjob_grade"] = "Grad", + ["command_setjob_invalid"] = "Jobbet, graden eller båda är ogiltiga", + ["command_setgroup"] = "Sätt en spelares grupp", + ["command_setgroup_group"] = "Grupp", + ["commanderror_argumentmismatch"] = "Invalid Argument Count (passed %s, wanted %s)", + ["commanderror_argumentmismatch_number"] = "Invalid Argument #%s data type (passed string, wanted number)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "Ogiltigt föremål", ["commanderror_invalidweapon"] = "Ogiltigt vapen", - ["commanderror_console"] = "Kommandot kan inte köras från konsolen", - ["commanderror_invalidcommand"] = "Ogiltigt kommando - /%s", - ["commanderror_invalidplayerid"] = "Angiven spelare är inte online", - ["commandgeneric_playerid"] = "Spelarens server-id", + ["commanderror_console"] = "Kommandot kan inte användas i konsolen", + ["commanderror_invalidcommand"] = "Ogiltigt kommand - /%s", + ["commanderror_invalidplayerid"] = "Spelaren är inte online", + ["commandgeneric_playerid"] = "Spelares ID", + ["command_giveammo_noweapon_found"] = "%s har inte detta vapen", + ["command_giveammo_weapon"] = "Vapen namn", + ["command_giveammo_ammo"] = "Antal ammo", + ["tpm_nowaypoint"] = "Ingen markör sutten.", + ["tpm_success"] = "Du har teleporterat", + + ["noclip_message"] = "Noclip har %s", + ["enabled"] = "~g~aktiverats~s~", + ["disabled"] = "~r~avaktiverats~s~", -- Locale settings - ["locale_digit_grouping_symbol"] = " ", - ["locale_currency"] = "%s SEK", + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "%skr", -- Weapons -- Melee ["weapon_dagger"] = "Dolk", - ["weapon_bat"] = "Slagträ", + ["weapon_bat"] = "Baseballträd", ["weapon_battleaxe"] = "Stridsyxa", - ["weapon_bottle"] = "Flaska", + ["weapon_bottle"] = "Glasflaska", ["weapon_crowbar"] = "Kofot", ["weapon_flashlight"] = "Ficklampa", ["weapon_golfclub"] = "Golfklubba", @@ -113,11 +143,11 @@ Locales["sv"] = { ["weapon_knife"] = "Kniv", ["weapon_knuckle"] = "Knogjärn", ["weapon_machete"] = "Machete", - ["weapon_nightstick"] = "Batong", + ["weapon_nightstick"] = "Ficklampa", ["weapon_wrench"] = "Rörtång", ["weapon_poolcue"] = "Biljardkö", ["weapon_stone_hatchet"] = "Stenyxa", - ["weapon_switchblade"] = "Fällkniv", + ["weapon_switchblade"] = "Fickkniv", -- Handguns ["weapon_appistol"] = "AP Pistol", @@ -178,6 +208,7 @@ Locales["sv"] = { ["weapon_militaryrifle"] = "Military Rifle", ["weapon_specialcarbine"] = "Special Carbine", ["weapon_specialcarbine_mk2"] = "Special Carbine MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Sniper ["weapon_heavysniper"] = "Heavy Sniper", @@ -196,27 +227,38 @@ Locales["sv"] = { ["weapon_rpg"] = "Rocket Launcher", ["weapon_rayminigun"] = "Widowmaker", + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "Metal Detector", + ["weapon_precisionrifle"] = "Precision Rifle", + ["weapon_tactilerifle"] = "Service Carbine", + + -- Drug wars dlc + ["weapon_candycane"] = "Candycane", + ["weapon_acidpackage"] = "Acid Package", + ["weapon_pistolxm3"] = "Pistol8 x3m", + ["weapon_railgunxm3"] = "Railgun", + -- Thrown ["weapon_ball"] = "Baseball", ["weapon_bzgas"] = "BZ Gas", - ["weapon_flare"] = "Flare", - ["weapon_grenade"] = "Grenade", - ["weapon_petrolcan"] = "Jerrycan", + ["weapon_flare"] = "Bloss", + ["weapon_grenade"] = "Granat", + ["weapon_petrolcan"] = "Bensindunk", ["weapon_hazardcan"] = "Hazardous Jerrycan", - ["weapon_molotov"] = "Molotov Cocktail", - ["weapon_proxmine"] = "Proximity Mine", + ["weapon_molotov"] = "Molotov", + ["weapon_proxmine"] = "Mina", ["weapon_pipebomb"] = "Pipe Bomb", - ["weapon_snowball"] = "Snowball", + ["weapon_snowball"] = "Snöboll", ["weapon_stickybomb"] = "Sticky Bomb", - ["weapon_smokegrenade"] = "Tear Gas", + ["weapon_smokegrenade"] = "Tårgas", -- Special - ["weapon_fireextinguisher"] = "Fire Extinguisher", + ["weapon_fireextinguisher"] = "Brandsläckare", ["weapon_digiscanner"] = "Digital Scanner", - ["weapon_garbagebag"] = "Garbage Bag", - ["weapon_handcuffs"] = "Handcuffs", + ["weapon_garbagebag"] = "Soppåse", + ["weapon_handcuffs"] = "Handklovar", ["gadget_nightvision"] = "Night Vision", - ["gadget_parachute"] = "parachute", + ["gadget_parachute"] = "Fallskärm", -- Weapon Components ["component_knuckle_base"] = "base Model", @@ -276,7 +318,7 @@ Locales["sv"] = { ["component_scope_advanced"] = "advanced Scope", ["component_ironsights"] = "ironsights", - ["component_suppressor"] = "suppressor", + ["component_suppressor"] = "ljuddämpare", ["component_compensator"] = "compensator", ["component_muzzle_flat"] = "flat Muzzle Brake", @@ -288,8 +330,8 @@ Locales["sv"] = { ["component_muzzle_split"] = "split-End Muzzle Brake", ["component_muzzle_squared"] = "squared Muzzle Brake", - ["component_flashlight"] = "flashlight", - ["component_grip"] = "grip", + ["component_flashlight"] = "Ficklampa", + ["component_grip"] = "grepp", ["component_barrel_default"] = "default Barrel", ["component_barrel_heavy"] = "heavy Barrel", @@ -308,32 +350,32 @@ Locales["sv"] = { ["component_shells_explosive"] = "explosive Slug Shells", -- Weapon Ammo - ["ammo_rounds"] = "ammunition", - ["ammo_shells"] = "hagel", - ["ammo_charge"] = "laddning", - ["ammo_petrol"] = "bensin", - ["ammo_firework"] = "fyrverkeri(er)", - ["ammo_rockets"] = "raket(er)", - ["ammo_grenadelauncher"] = "grenat(er)", - ["ammo_grenade"] = "grenat(er)", - ["ammo_stickybomb"] = "bomb(er)", - ["ammo_pipebomb"] = "bomb(er)", - ["ammo_smokebomb"] = "bomb(er)", + ["ammo_rounds"] = "round(s)", + ["ammo_shells"] = "shell(s)", + ["ammo_charge"] = "charge", + ["ammo_petrol"] = "gallons of fuel", + ["ammo_firework"] = "firework(s)", + ["ammo_rockets"] = "rocket(s)", + ["ammo_grenadelauncher"] = "grenade(s)", + ["ammo_grenade"] = "grenade(s)", + ["ammo_stickybomb"] = "bomb(s)", + ["ammo_pipebomb"] = "bomb(s)", + ["ammo_smokebomb"] = "bomb(s)", ["ammo_molotov"] = "cocktail(s)", - ["ammo_proxmine"] = "bomb(er)", - ["ammo_bzgas"] = "burk(ar)", - ["ammo_ball"] = "boll(ar)", - ["ammo_snowball"] = "snöboll(ar)", - ["ammo_flare"] = "lysraket(er)", - ["ammo_flaregun"] = "lysraket(er)", + ["ammo_proxmine"] = "mine(s)", + ["ammo_bzgas"] = "can(s)", + ["ammo_ball"] = "ball(s)", + ["ammo_snowball"] = "snowball(s)", + ["ammo_flare"] = "flare(s)", + ["ammo_flaregun"] = "flare(s)", -- Weapon Tints - ["tint_default"] = "Standard färg", - ["tint_green"] = "Grön färg", - ["tint_gold"] = "Guld färg", - ["tint_pink"] = "Rosa färg", - ["tint_army"] = "Armé färg", - ["tint_lspd"] = "Blå färg", - ["tint_orange"] = "Orange färg", - ["tint_platinum"] = "Platina färg", + ["tint_default"] = "default skin", + ["tint_green"] = "green skin", + ["tint_gold"] = "gold skin", + ["tint_pink"] = "pink skin", + ["tint_army"] = "army skin", + ["tint_lspd"] = "blue skin", + ["tint_orange"] = "orange skin", + ["tint_platinum"] = "platinum skin", } diff --git a/server-data/resources/[esx]/es_extended/locales/zh-cn.lua b/server-data/resources/[esx]/es_extended/locales/zh-cn.lua new file mode 100644 index 000000000..328d7584c --- /dev/null +++ b/server-data/resources/[esx]/es_extended/locales/zh-cn.lua @@ -0,0 +1,377 @@ +Locales["zh-cn"] = { + -- Inventory + ["inventory"] = "背包 %s / %s", + ["use"] = "使用", + ["give"] = "给予", + ["remove"] = "赠送", + ["return"] = "返回", + ["give_to"] = "赠给", + ["amount"] = "数量", + ["giveammo"] = "赠送弹药", + ["amountammo"] = "弹药量", + ["noammo"] = "您没有足够的弹药!", + ["gave_item"] = "您将 %sx %s 赠送给 %s", + ["received_item"] = "您收到 %sx %s, 来自于 %s 的赠送", + ["gave_weapon"] = "您把 %s 赠送给 %s", + ["gave_weapon_ammo"] = "您把 ~o~%sx %s %s 赠送给 %s", + ["gave_weapon_withammo"] = "您把 %s 和 ~o~%sx %s 赠送给 %s", + ["gave_weapon_hasalready"] = "%s 已持有 %s", + ["gave_weapon_noweapon"] = "%s 暂无该类型武器", + ["received_weapon"] = "您收到了 %s, 来自于 %s 的赠送", + ["received_weapon_ammo"] = "您收到了 ~o~%sx %s (%s),来自于%s的赠送", + ["received_weapon_withammo"] = "您收到了 %s 和~o~%sx %s,来自于%s的赠送", + ["received_weapon_hasalready"] = "%s 试图给您 %s,但您已持有", + ["received_weapon_noweapon"] = "%s 试图给您 %s 发子弹,但是您沒有该类型武器", + ["gave_account_money"] = "您将 $%s (%s) 赠送给 %s", + ["received_account_money"] = "您收到了 $%s (%s) 来自 %s 的赠送", + ["amount_invalid"] = "无效数量", + ["players_nearby"] = "附近没有玩家", + ["ex_inv_lim"] = "操作失败, 超过 %s 背包物品的上限", + ["imp_invalid_quantity"] = "操作失败,无效数量输入", + ["imp_invalid_amount"] = "操作失败,无效金额输入", + ["threw_standard"] = "您丢弃了 %sx %s", + ["threw_account"] = "您丢弃了 $%s %s", + ["threw_weapon"] = "您丢弃了 %s", + ["threw_weapon_ammo"] = "您丢弃了 %s 和 ~o~%sx %s", + ["threw_weapon_already"] = "您已持有相同武器!", + ["threw_cannot_pickup"] = "背包容量已满, 无法持有更多该物品!", + ["threw_pickup_prompt"] = "键下 [E] 捡起", + + -- Key mapping + ["keymap_showinventory"] = "显示背包", + + -- Salary related + ["received_salary"] = "您收到了您的工资: $%s", + ["received_help"] = "您领取到了您的无业性低保: $%s", + ["company_nomoney"] = "您受雇的公司太穷了,无法清算您的工资.", + ["received_paycheck"] = "收到转账", + ["bank"] = "花园银行", + ["account_bank"] = "银行", + ["account_black_money"] = "赃款", + ["account_money"] = "现金", + + ["act_imp"] = "操作失败", + ["in_vehicle"] = "请离开当前载具", + ["not_in_vehicle"] = "Cannot Perform Action, Player isn't in a vehicle", + + -- Commands + ["command_bring"] = "传送玩家到您身边", + ["command_car"] = "生成载具", + ["command_car_car"] = "生成载具的模型名称或哈希值", + ["command_cardel"] = "删除附近载具", + ["command_cardel_radius"] = "可选,删除指定半径内的所有载具", + ["command_repair"] = "Repair your vehicle", + ["command_repair_success"] = "Successfully repaired vehicle", + ["command_repair_success_target"] = "An admin repaired your vehicle", + ["command_clear"] = "清除聊天记录", + ["command_clearall"] = "清除所有玩家的聊天记录", + ["command_clearinventory"] = "清除玩家库存", + ["command_clearloadout"] = "清除玩家武器栏", + ["command_freeze"] = "冻结玩家", + ["command_unfreeze"] = "解冻玩家", + ["command_giveaccountmoney"] = "给予任意账户资金", + ["command_giveaccountmoney_account"] = "有效的帐户类型", + ["command_giveaccountmoney_amount"] = "添加的金额数量", + ["command_giveaccountmoney_invalid"] = "无效的帐户类型", + ["command_giveitem"] = "给予玩家一件物品", + ["command_giveitem_item"] = "物品代码", + ["command_giveitem_count"] = "物品数目", + ["command_giveweapon"] = "给予玩家一把武器", + ["command_giveweapon_weapon"] = "武器代码", + ["command_giveweapon_ammo"] = "弹药数目", + ["command_giveweapon_hasalready"] = "该玩家已拥有该武器", + ["command_giveweaponcomponent"] = "给予武器改装件", + ["command_giveweaponcomponent_component"] = "改装件代码", + ["command_giveweaponcomponent_invalid"] = "无效的武器改装件", + ["command_giveweaponcomponent_hasalready"] = "玩家已拥有该武器改装件", + ["command_giveweaponcomponent_missingweapon"] = "该玩家暂无该类型改装件的武器", + ["command_goto"] = "传送至一名玩家身旁", + ["command_kill"] = "击杀一名玩家", + ["command_save"] = "保存玩家数据至数据库", + ["command_saveall"] = "保存所有玩家数据至数据库", + ["command_setaccountmoney"] = "设置玩家帐户内资金", + ["command_setaccountmoney_amount"] = "账户资金金额", + ["command_setcoords"] = "传送至XYZ坐标", + ["command_setcoords_x"] = "X 轴", + ["command_setcoords_y"] = "Y 轴", + ["command_setcoords_z"] = "Z 轴", + ["command_setjob"] = "配置该玩家职业", + ["command_setjob_job"] = "职业代码", + ["command_setjob_grade"] = "职业等级", + ["command_setjob_invalid"] = "职业代码、等级或输入数据无效!", + ["command_setgroup"] = "设置玩家用户组", + ["command_setgroup_group"] = "用户组代码", + ["commanderror_argumentmismatch"] = "参数计数不匹配 (该类型为 %s, 需要传输 %s)", + ["commanderror_argumentmismatch_number"] = "参数 #%s 类型不匹配 (该类型为字符串,需要传递数字类型)", + ["commanderror_argumentmismatch_string"] = "Invalid Argument #%s data type (passed number, wanted string)", + ["commanderror_invaliditem"] = "无效的物品代码", + ["commanderror_invalidweapon"] = "无效的武器代码", + ["commanderror_console"] = "控制台无法执行此命令!", + ["commanderror_invalidcommand"] = "/%s 不是有效的命令!", + ["commanderror_invalidplayerid"] = "无效的玩家服务器ID", + ["commandgeneric_playerid"] = "玩家服务器ID", + ["command_giveammo_noweapon_found"] = "%s 为无效的武器代码!", + ["command_giveammo_weapon"] = "武器代码", + ["command_giveammo_ammo"] = "弹药数量", + ["tpm_nowaypoint"] = "尚未配置导航点!", + ["tpm_success"] = "已传送至该导航点", + + ["noclip_message"] = "飞行模式已被激活 %s", + ["enabled"] = "~g~已开启~s~", + ["disabled"] = "~r~已关闭~s~", + + -- Locale settings + ["locale_digit_grouping_symbol"] = ",", + ["locale_currency"] = "$%s", + + -- Weapons + + -- Melee + ["weapon_dagger"] = "古骑兵匕首", + ["weapon_bat"] = "棒球棍", + ["weapon_battleaxe"] = "战斧", + ["weapon_bottle"] = "碎酒瓶", + ["weapon_crowbar"] = "撬棍", + ["weapon_flashlight"] = "手电筒", + ["weapon_golfclub"] = "高尔夫球杆", + ["weapon_hammer"] = "铁锤", + ["weapon_hatchet"] = "手斧", + ["weapon_knife"] = "小刀", + ["weapon_knuckle"] = "手指虎", + ["weapon_machete"] = "开山刀", + ["weapon_nightstick"] = "警棍", + ["weapon_wrench"] = "管钳扳手", + ["weapon_poolcue"] = "台球杆", + ["weapon_stone_hatchet"] = "石斧", + ["weapon_switchblade"] = "弹簧刀", + + -- Handguns + ["weapon_appistol"] = "穿甲手枪", + ["weapon_ceramicpistol"] = "陶瓷手枪", + ["weapon_combatpistol"] = "战斗手枪", + ["weapon_doubleaction"] = "双动式左轮手枪", + ["weapon_navyrevolver"] = "海军左轮手枪", + ["weapon_flaregun"] = "信号枪", + ["weapon_gadgetpistol"] = "佩里克手枪", + ["weapon_heavypistol"] = "重型手枪", + ["weapon_revolver"] = "重型左轮手枪", + ["weapon_revolver_mk2"] = "重型左轮手枪-MK2", + ["weapon_marksmanpistol"] = "射手手枪", + ["weapon_pistol"] = "手枪", + ["weapon_pistol_mk2"] = "手枪-MK2", + ["weapon_pistol50"] = "0.5-口径手枪", + ["weapon_snspistol"] = "劣质手枪", + ["weapon_snspistol_mk2"] = "劣质手枪-MK2", + ["weapon_stungun"] = "电击枪", + ["weapon_raypistol"] = "原子堡手枪", + ["weapon_vintagepistol"] = "老式手枪", + + -- Shotguns + ["weapon_assaultshotgun"] = "突击霰弹枪", + ["weapon_autoshotgun"] = "半自动霰弹枪", + ["weapon_bullpupshotgun"] = "无托式霰弹枪", + ["weapon_combatshotgun"] = "战斗霰弹枪", + ["weapon_dbshotgun"] = "双管霰弹枪", + ["weapon_heavyshotgun"] = "重型霰弹枪", + ["weapon_musket"] = "老式火枪", + ["weapon_pumpshotgun"] = "泵动式霰弹枪", + ["weapon_pumpshotgun_mk2"] = "泵动式霰弹枪-MK2", + ["weapon_sawnoffshotgun"] = "短管霰弹枪", + + -- SMG & LMG + ["weapon_assaultsmg"] = "突击冲锋枪", + ["weapon_combatmg"] = "战斗机枪", + ["weapon_combatmg_mk2"] = "战斗机枪-MK2", + ["weapon_combatpdw"] = "作战自卫冲锋枪", + ["weapon_gusenberg"] = "古森柏冲锋枪", + ["weapon_machinepistol"] = "冲锋手枪", + ["weapon_mg"] = "机枪", + ["weapon_microsmg"] = "微型冲锋枪", + ["weapon_minismg"] = "迷你冲锋枪", + ["weapon_smg"] = "冲锋枪", + ["weapon_smg_mk2"] = "冲锋枪-MK2", + ["weapon_raycarbine"] = "不洁使者", + + -- Rifles + ["weapon_advancedrifle"] = "高级步枪", + ["weapon_assaultrifle"] = "突击步枪", + ["weapon_assaultrifle_mk2"] = "突击步枪-MK2", + ["weapon_bullpuprifle"] = "无托式步枪", + ["weapon_bullpuprifle_mk2"] = "无托式步枪-MK2", + ["weapon_carbinerifle"] = "卡宾步枪", + ["weapon_carbinerifle_mk2"] = "卡宾步枪-MK2", + ["weapon_compactrifle"] = "紧凑型步枪", + ["weapon_militaryrifle"] = "军用步枪", + ["weapon_specialcarbine"] = "特制卡宾步枪", + ["weapon_specialcarbine_mk2"] = "特制卡宾步枪-MK2", + ["weapon_heavyrifle"] = "Heavy Rifle", -- Not Translated + + -- Sniper + ["weapon_heavysniper"] = "重型狙击步枪", + ["weapon_heavysniper_mk2"] = "重型狙击步枪-MK2", + ["weapon_marksmanrifle"] = "射手步枪", + ["weapon_marksmanrifle_mk2"] = "射手步枪-MK2", + ["weapon_sniperrifle"] = "狙击步枪", + + -- Heavy / Launchers + ["weapon_compactlauncher"] = "紧凑型榴弹发射器", + ["weapon_firework"] = "烟花发射器", + ["weapon_grenadelauncher"] = "榴弹发射器", + ["weapon_hominglauncher"] = "制导火箭发射器", + ["weapon_minigun"] = "火神机枪", + ["weapon_railgun"] = "电磁轨道炮", + ["weapon_rpg"] = "火箭炮", + ["weapon_rayminigun"] = "寡妇制造者", + + -- Criminal Enterprises DLC + ["weapon_metaldetector"] = "金属探测器", + ["weapon_precisionrifle"] = "精确步枪", + ["weapon_tactilerifle"] = "制式卡宾步枪", + + -- Drug Wars DLC + ["weapon_candycane"] = "Candy Cane", -- not translated + ["weapon_acidpackage"] = "Acid Package", -- not translated + ["weapon_pistolxm3"] = "WM 29 Pistol", -- not translated + ["weapon_railgunxm3"] = "Railgun", -- not translated + + -- Thrown + ["weapon_ball"] = "棒球", + ["weapon_bzgas"] = "毒气弹", + ["weapon_flare"] = "信号棒", + ["weapon_grenade"] = "手榴弹", + ["weapon_petrolcan"] = "汽油桶", + ["weapon_hazardcan"] = "有害汽油桶", + ["weapon_molotov"] = "汽油弹", + ["weapon_proxmine"] = "感应式地雷", + ["weapon_pipebomb"] = "土製炸彈", + ["weapon_snowball"] = "雪球", + ["weapon_stickybomb"] = "黏弹", + ["weapon_smokegrenade"] = "烟雾弹", + + -- Special + ["weapon_fireextinguisher"] = "灭火器", + ["weapon_digiscanner"] = "数位扫描仪", + ["weapon_garbagebag"] = "垃圾袋", + ["weapon_handcuffs"] = "手铐", + ["gadget_nightvision"] = "夜视仪", + ["gadget_parachute"] = "降落伞", + + -- Weapon Components + ["component_knuckle_base"] = "基本样式", + ["component_knuckle_pimp"] = "皮条客", + ["component_knuckle_ballas"] = "巴拉斯帮", + ["component_knuckle_dollar"] = "江湖骗子", + ["component_knuckle_diamond"] = "摇滚朋克", + ["component_knuckle_hate"] = "怨气冤家", + ["component_knuckle_love"] = "甜蜜情人", + ["component_knuckle_player"] = "花花公子", + ["component_knuckle_king"] = "霸者之风", + ["component_knuckle_vagos"] = "维戈斯帮", + + ["component_luxary_finish"] = "奢华涂饰", + + ["component_handle_default"] = "默认刀柄", + ["component_handle_vip"] = "贵宾样式", + ["component_handle_bodyguard"] = "保镖款式", + + ["component_vip_finish"] = "贵宾样式", + ["component_bodyguard_finish"] = "保镖款式", + + ["component_camo_finish"] = "数码迷彩", + ["component_camo_finish2"] = "笔刷迷彩", + ["component_camo_finish3"] = "林地迷彩", + ["component_camo_finish4"] = "骷髅头", + ["component_camo_finish5"] = "希斯提·耐", + ["component_camo_finish6"] = "神之子", + ["component_camo_finish7"] = "猎豹纹理", + ["component_camo_finish8"] = "斑马纹理", + ["component_camo_finish9"] = "几何图形", + ["component_camo_finish10"] = "BOOM!", + ["component_camo_finish11"] = "爱国者", + + ["component_camo_slide_finish"] = "数码迷涂装", + ["component_camo_slide_finish2"] = "笔刷迷彩涂装", + ["component_camo_slide_finish3"] = "林地迷彩涂装", + ["component_camo_slide_finish4"] = "骷髅头涂装", + ["component_camo_slide_finish5"] = "希斯提·耐涂装", + ["component_camo_slide_finish6"] = "神之子涂装", + ["component_camo_slide_finish7"] = "猎豹纹理涂装", + ["component_camo_slide_finish8"] = "斑马纹理涂装", + ["component_camo_slide_finish9"] = "几何图形涂装", + ["component_camo_slide_finish10"] = "BOOM涂装", + ["component_camo_slide_finish11"] = "爱国者涂装", + + ["component_clip_default"] = "默认弹夹", + ["component_clip_extended"] = "扩容弹夹", + ["component_clip_drum"] = "鼓式弹夹", + ["component_clip_box"] = "盒型弹匣", + + ["component_scope_holo"] = "全息式瞄准镜", + ["component_scope_small"] = "小型瞄准镜", + ["component_scope_medium"] = "中型瞄准镜", + ["component_scope_large"] = "大型瞄准镜", + ["component_scope"] = "瞄准镜", + ["component_scope_advanced"] = "高级瞄准镜", + ["component_ironsights"] = "铁式瞄具", + + ["component_suppressor"] = "消音器", + ["component_compensator"] = "补偿器", + + ["component_muzzle_flat"] = "扁型枪口制动器", + ["component_muzzle_tactical"] = "战术枪口制动器", + ["component_muzzle_fat"] = "宽尾型枪口制动器", + ["component_muzzle_precision"] = "精準枪口制动器", + ["component_muzzle_heavy"] = "耐用型枪口制动器", + ["component_muzzle_slanted"] = "倾斜型枪口制动器", + ["component_muzzle_split"] = "分岔型枪口制动器", + ["component_muzzle_squared"] = "方形枪口制动器", + + ["component_flashlight"] = "手电筒", + ["component_grip"] = "握把", + + ["component_barrel_default"] = "默认枪管", + ["component_barrel_heavy"] = "重型枪管", + + ["component_ammo_tracer"] = "曳光弹", + ["component_ammo_incendiary"] = "燃烧弹", + ["component_ammo_hollowpoint"] = "被甲空尖弹", + ["component_ammo_fmj"] = "全金属包裹弹", + ["component_ammo_armor"] = "穿甲弹", + ["component_ammo_explosive"] = "爆炸蛋弹", + + ["component_shells_default"] = "默认弹药", + ["component_shells_incendiary"] = "燃烧弹", + ["component_shells_armor"] = "钢式猎鹿蛋", + ["component_shells_hollowpoint"] = "被甲空尖弹", + ["component_shells_explosive"] = "爆裂弹", + + -- Weapon Ammo + ["ammo_rounds"] = "发(子弹)", + ["ammo_shells"] = "发(子弹)", + ["ammo_charge"] = "喷", + ["ammo_petrol"] = "加仑(燃料)", + ["ammo_firework"] = "发(烟花弹)", + ["ammo_rockets"] = "枚(火箭弹)", + ["ammo_grenadelauncher"] = "发(榴弹)", + ["ammo_grenade"] = "枚(手榴弹)", + ["ammo_stickybomb"] = "枚(炸弹)", + ["ammo_pipebomb"] = "枚(炸弹)", + ["ammo_smokebomb"] = "枚(炸彈)", + ["ammo_molotov"] = "瓶(燃烧瓶)", + ["ammo_proxmine"] = "个(地雷)", + ["ammo_bzgas"] = "罐", + ["ammo_ball"] = "个(棒球)", + ["ammo_snowball"] = "个(雪球)", + ["ammo_flare"] = "根(信号棒)", + ["ammo_flaregun"] = "发(信号弹)", + + -- Weapon Tints + ["tint_default"] = "默认色调", + ["tint_green"] = "绿色调", + ["tint_gold"] = "金色调", + ["tint_pink"] = "粉色调", + ["tint_army"] = "军用色调", + ["tint_lspd"] = "洛圣都警局色调", + ["tint_orange"] = "橙色调", + ["tint_platinum"] = "铂金色调", +} diff --git a/server-data/resources/[esx]/es_extended/server/classes/overrides/oxinventory.lua b/server-data/resources/[esx]/es_extended/server/classes/overrides/oxinventory.lua index fd90255f4..f8920f3b3 100644 --- a/server-data/resources/[esx]/es_extended/server/classes/overrides/oxinventory.lua +++ b/server-data/resources/[esx]/es_extended/server/classes/overrides/oxinventory.lua @@ -36,7 +36,7 @@ Core.PlayerFunctionOverrides.OxInventory = { end end, - getLoadout = function(_) + getLoadout = function() return function() return {} end @@ -144,49 +144,49 @@ Core.PlayerFunctionOverrides.OxInventory = { end end, - addWeapon = function(_) + addWeapon = function() return function() end end, - addWeaponComponent = function(_) + addWeaponComponent = function() return function() end end, - addWeaponAmmo = function(_) + addWeaponAmmo = function() return function() end end, - updateWeaponAmmo = function(_) + updateWeaponAmmo = function() return function() end end, - setWeaponTint = function(_) + setWeaponTint = function() return function() end end, - getWeaponTint = function(_) + getWeaponTint = function() return function() end end, - removeWeapon = function(_) + removeWeapon = function() return function() end end, - removeWeaponComponent = function(_) + removeWeaponComponent = function() return function() end end, - removeWeaponAmmo = function(_) + removeWeaponAmmo = function() return function() end end, - hasWeaponComponent = function(_) + hasWeaponComponent = function() return function() return false end end, - hasWeapon = function(_) + hasWeapon = function() return function() return false end @@ -198,7 +198,7 @@ Core.PlayerFunctionOverrides.OxInventory = { end end, - getWeapon = function(_) + getWeapon = function() return function() end end, diff --git a/server-data/resources/[esx]/es_extended/server/classes/player.lua b/server-data/resources/[esx]/es_extended/server/classes/player.lua index 937e2ee25..aed703347 100644 --- a/server-data/resources/[esx]/es_extended/server/classes/player.lua +++ b/server-data/resources/[esx]/es_extended/server/classes/player.lua @@ -1,6 +1,27 @@ -local GetPlayerPed = GetPlayerPed -local GetEntityCoords = GetEntityCoords - +local _GetPlayerPed = GetPlayerPed +local _GetEntityCoords = GetEntityCoords +local _ExecuteCommand = ExecuteCommand +local _SetEntityCoords = SetEntityCoords +local _SetEntityHeading = SetEntityHeading +local _TriggerClientEvent = TriggerClientEvent +local _DropPlayer = DropPlayer +local _TriggerEvent = TriggerEvent +local _GiveWeaponToPed = GiveWeaponToPed +local _SetPedAmmo = SetPedAmmo +local _RemoveWeaponFromPed = RemoveWeaponFromPed +local _assert = assert + +---@param playerId number +---@param identifier string +---@param group string +---@param accounts table +---@param inventory table +---@param weight number +---@param job table +---@param loadout table +---@param name string +---@param coords table | vector4 +---@param metadata table function CreateExtendedPlayer( playerId, identifier, @@ -41,7 +62,7 @@ function CreateExtendedPlayer( self.license = "license:" .. identifier end - ExecuteCommand(("add_principal identifier.%s group.%s"):format(self.license, self.group)) + _ExecuteCommand(("add_principal identifier.%s group.%s"):format(self.license, self.group)) local stateBag = Player(self.source).state stateBag:set("identifier", self.identifier, true) @@ -51,81 +72,104 @@ function CreateExtendedPlayer( stateBag:set("name", self.name, true) stateBag:set("metadata", self.metadata, true) + ---@param eventName string + ---@param ... any + ---@return void function self.triggerEvent(eventName, ...) - TriggerClientEvent(eventName, self.source, ...) + _assert(type(eventName) == "string", "eventName should be string!") + _TriggerClientEvent(eventName, self.source, ...) end + ---@param coordinates vector4 | vector3 | table + ---@return void function self.setCoords(coordinates) - local Ped = GetPlayerPed(self.source) + local ped = _GetPlayerPed(self.source) local vector = type(coordinates) == "vector4" and coordinates or type(coordinates) == "vector3" and vector4(coordinates, 0.0) or vec(coordinates.x, coordinates.y, coordinates.z, coordinates.heading or 0.0) - SetEntityCoords(Ped, vector.xyz, false, false, false, false) - SetEntityHeading(Ped, vector.w) + _SetEntityCoords(ped, vector.xyz, false, false, false, false) + _SetEntityHeading(ped, vector.w) end + ---@param vector boolean + ---@return vector3 | table function self.getCoords(vector) - local ped = GetPlayerPed(self.source) - local coordinates = GetEntityCoords(ped) + local ped = _GetPlayerPed(self.source) + local coordinates = _GetEntityCoords(ped) - if vector then - return coordinates - else - return { - x = coordinates.x, - y = coordinates.y, - z = coordinates.z, - } - end + return vector and coordinates or { x = coordinates.x, y = coordinates.y, z = coordinates.z } end + ---@param reason string + ---@return void function self.kick(reason) - DropPlayer(self.source, reason) + _DropPlayer(self.source, reason) end + ---@param money number + ---@return void function self.setMoney(money) + _assert(type(money) == "number", "money should be number!") money = ESX.Math.Round(money) self.setAccountMoney("money", money) end + ---@return number function self.getMoney() return self.getAccount("money").money end + ---@param money number + ---@param reason string + ---@return void function self.addMoney(money, reason) money = ESX.Math.Round(money) self.addAccountMoney("money", money, reason) end + ---@param money number + ---@param reason string + ---@return void function self.removeMoney(money, reason) money = ESX.Math.Round(money) self.removeAccountMoney("money", money, reason) end + ---@return string function self.getIdentifier() return self.identifier end + ---@param newGroup string + ---@return void function self.setGroup(newGroup) - ExecuteCommand(("remove_principal identifier.%s group.%s"):format(self.license, self.group)) + _ExecuteCommand(("remove_principal identifier.%s group.%s"):format(self.license, self.group)) self.group = newGroup Player(self.source).state:set("group", self.group, true) - ExecuteCommand(("add_principal identifier.%s group.%s"):format(self.license, self.group)) + _ExecuteCommand(("add_principal identifier.%s group.%s"):format(self.license, self.group)) end + ---@return string function self.getGroup() return self.group end + ---@param k string + ---@param v any + ---@return void function self.set(k, v) self.variables[k] = v Player(self.source).state:set(k, v, true) end + ---@param k string + ---@return any function self.get(k) return self.variables[k] end + ---@param minimal boolean + ---@return table function self.getAccounts(minimal) if not minimal then return self.accounts @@ -140,6 +184,8 @@ function CreateExtendedPlayer( return minimalAccounts end + ---@param account string + ---@return table | nil function self.getAccount(account) for i = 1, #self.accounts do if self.accounts[i].name == account then @@ -149,6 +195,8 @@ function CreateExtendedPlayer( return nil end + ---@param minimal boolean + ---@return table function self.getInventory(minimal) if minimal then local minimalInventory = {} @@ -165,10 +213,13 @@ function CreateExtendedPlayer( return self.inventory end + ---@return table function self.getJob() return self.job end + ---@param minimal boolean + ---@return table function self.getLoadout(minimal) if not minimal then return self.loadout @@ -199,15 +250,22 @@ function CreateExtendedPlayer( return minimalLoadout end + ---@return string function self.getName() return self.name end + ---@param newName string + ---@return void function self.setName(newName) self.name = newName Player(self.source).state:set("name", self.name, true) end + ---@param accountName string + ---@param money number + ---@param reason string + ---@return void function self.setAccountMoney(accountName, money, reason) reason = reason or "unknown" if not tonumber(money) then @@ -228,7 +286,7 @@ function CreateExtendedPlayer( self.accounts[account.index].money = money self.triggerEvent("esx:setAccountMoney", account) - TriggerEvent("esx:setAccountMoney", self.source, accountName, money, reason) + _TriggerEvent("esx:setAccountMoney", self.source, accountName, money, reason) else print( ("[^1ERROR^7] Tried To Set Invalid Account ^5%s^0 For Player ^5%s^0!"):format( @@ -248,6 +306,10 @@ function CreateExtendedPlayer( end end + ---@param accountName string + ---@param money number + ---@param reason string + ---@return void function self.addAccountMoney(accountName, money, reason) reason = reason or "Unknown" if not tonumber(money) then @@ -267,7 +329,7 @@ function CreateExtendedPlayer( self.accounts[account.index].money = self.accounts[account.index].money + money self.triggerEvent("esx:setAccountMoney", account) - TriggerEvent("esx:addAccountMoney", self.source, accountName, money, reason) + _TriggerEvent("esx:addAccountMoney", self.source, accountName, money, reason) else print( ("[^1ERROR^7] Tried To Set Add To Invalid Account ^5%s^0 For Player ^5%s^0!"):format( @@ -287,6 +349,10 @@ function CreateExtendedPlayer( end end + ---@param accountName string + ---@param money number + ---@param reason string + ---@return void function self.removeAccountMoney(accountName, money, reason) reason = reason or "Unknown" if not tonumber(money) then @@ -316,7 +382,7 @@ function CreateExtendedPlayer( self.accounts[account.index].money = self.accounts[account.index].money - money self.triggerEvent("esx:setAccountMoney", account) - TriggerEvent("esx:removeAccountMoney", self.source, accountName, money, reason) + _TriggerEvent("esx:removeAccountMoney", self.source, accountName, money, reason) else print( ("[^1ERROR^7] Tried To Set Add To Invalid Account ^5%s^0 For Player ^5%s^0!"):format( @@ -336,14 +402,20 @@ function CreateExtendedPlayer( end end + ---@param itemName string + ---@return table | nil function self.getInventoryItem(itemName) for _, v in ipairs(self.inventory) do if v.name == itemName then return v end end + return nil end + ---@param itemName string + ---@param count number + ---@return void function self.addInventoryItem(itemName, count) local item = self.getInventoryItem(itemName) @@ -352,11 +424,14 @@ function CreateExtendedPlayer( item.count = item.count + count self.weight = self.weight + (item.weight * count) - TriggerEvent("esx:onAddInventoryItem", self.source, item.name, item.count) + _TriggerEvent("esx:onAddInventoryItem", self.source, item.name, item.count) self.triggerEvent("esx:addInventoryItem", item.name, item.count) end end + ---@param itemName string + ---@param count number + ---@return void function self.removeInventoryItem(itemName, count) local item = self.getInventoryItem(itemName) @@ -369,7 +444,7 @@ function CreateExtendedPlayer( item.count = newCount self.weight = self.weight - (item.weight * count) - TriggerEvent("esx:onRemoveInventoryItem", self.source, item.name, item.count) + _TriggerEvent("esx:onRemoveInventoryItem", self.source, item.name, item.count) self.triggerEvent("esx:removeInventoryItem", item.name, item.count) end else @@ -384,6 +459,9 @@ function CreateExtendedPlayer( end end + ---@param itemName string + ---@param count number + ---@return void function self.setInventoryItem(itemName, count) local item = self.getInventoryItem(itemName) @@ -398,14 +476,19 @@ function CreateExtendedPlayer( end end + ---@return number function self.getWeight() return self.weight end + ---@return number function self.getMaxWeight() return self.maxWeight end + ---@param itemName string + ---@param count number + ---@return boolean function self.canCarryItem(itemName, count) if ESX.Items[itemName] then local currentWeight, itemWeight = self.weight, ESX.Items[itemName].weight @@ -417,6 +500,11 @@ function CreateExtendedPlayer( end end + ---@param firstItem string + ---@param firstItemCount number + ---@param testItem string + ---@param testItemCount number + ---@return boolean function self.canSwapItem(firstItem, firstItemCount, testItem, testItemCount) local firstItemObject = self.getInventoryItem(firstItem) local testItemObject = self.getInventoryItem(testItem) @@ -431,55 +519,56 @@ function CreateExtendedPlayer( return false end + ---@param newWeight number + ---@return void function self.setMaxWeight(newWeight) self.maxWeight = newWeight self.triggerEvent("esx:setMaxWeight", self.maxWeight) end + ---@param newJob string + ---@param grade string + ---@return void function self.setJob(newJob, grade) grade = tostring(grade) - local lastJob = json.decode(json.encode(self.job)) - - if ESX.DoesJobExist(newJob, grade) then - local jobObject, gradeObject = ESX.Jobs[newJob], ESX.Jobs[newJob].grades[grade] - - self.job.id = jobObject.id - self.job.name = jobObject.name - self.job.label = jobObject.label - - self.job.grade = tonumber(grade) - self.job.grade_name = gradeObject.name - self.job.grade_label = gradeObject.label - self.job.grade_salary = gradeObject.salary - - if gradeObject.skin_male then - self.job.skin_male = json.decode(gradeObject.skin_male) - else - self.job.skin_male = {} - end - - if gradeObject.skin_female then - self.job.skin_female = json.decode(gradeObject.skin_female) - else - self.job.skin_female = {} - end + local lastJob = self.job - TriggerEvent("esx:setJob", self.source, self.job, lastJob) - self.triggerEvent("esx:setJob", self.job, lastJob) - Player(self.source).state:set("job", self.job, true) - else - print( + if not ESX.DoesJobExist(newJob, grade) then + return print( ("[es_extended] [^3WARNING^7] Ignoring invalid ^5.setJob()^7 usage for ID: ^5%s^7, Job: ^5%s^7"):format( self.source, job ) ) end + + local jobObject, gradeObject = ESX.Jobs[newJob], ESX.Jobs[newJob].grades[grade] + + self.job = { + id = jobObject.id, + name = jobObject.name, + label = jobObject.label, + + grade = tonumber(grade), + grade_name = gradeObject.name, + grade_label = gradeObject.label, + grade_salary = gradeObject.salary, + + skin_male = gradeObject.skin_male and json.decode(gradeObject.skin_male) or {}, + skin_female = gradeObject.skin_female and json.decode(gradeObject.skin_female) or {}, + } + + TriggerEvent("esx:setJob", self.source, self.job, lastJob) + self.triggerEvent("esx:setJob", self.job, lastJob) + Player(self.source).state:set("job", self.job, true) end + ---@param weaponName string + ---@param ammo number + ---@return void function self.addWeapon(weaponName, ammo) if not self.hasWeapon(weaponName) then - local weaponLabel = ESX.GetWeaponLabel(weaponName) + local weaponLabel = ESX.GetWeaponLabel(weaponName) table.insert(self.loadout, { name = weaponName, @@ -489,13 +578,16 @@ function CreateExtendedPlayer( tintIndex = 0, }) - GiveWeaponToPed(GetPlayerPed(self.source), joaat(weaponName), ammo, false, false) + _GiveWeaponToPed(_GetPlayerPed(self.source), joaat(weaponName), ammo, false, false) self.triggerEvent("esx:addInventoryItem", weaponLabel, false, true) end end + ---@param weaponName string + ---@param weaponComponent string + ---@return void function self.addWeaponComponent(weaponName, weaponComponent) - local loadoutNum, weapon = self.getWeapon(weaponName) + local loadoutNum , weapon = self.getWeapon(weaponName) if weapon then local component = ESX.GetWeaponComponent(weaponName, weaponComponent) @@ -511,15 +603,21 @@ function CreateExtendedPlayer( end end + ---@param weaponName string + ---@param ammoCount number + ---@return void function self.addWeaponAmmo(weaponName, ammoCount) local _, weapon = self.getWeapon(weaponName) if weapon then weapon.ammo = weapon.ammo + ammoCount - SetPedAmmo(GetPlayerPed(self.source), joaat(weaponName), weapon.ammo) + _SetPedAmmo(GetPlayerPed(self.source), joaat(weaponName), weapon.ammo) end end + ---@param weaponName string + ---@param ammoCount number + ---@return void function self.updateWeaponAmmo(weaponName, ammoCount) local _, weapon = self.getWeapon(weaponName) @@ -528,11 +626,14 @@ function CreateExtendedPlayer( end end + ---@param weaponName string + ---@param weaponTintIndex number + ---@return void function self.setWeaponTint(weaponName, weaponTintIndex) - local loadoutNum, weapon = self.getWeapon(weaponName) + local loadoutNum , weapon = self.getWeapon(weaponName) if weapon then - local _, weaponObject = ESX.GetWeapon(weaponName) + local _, weaponObject = ESX.GetWeapon(weaponName) if weaponObject.tints and weaponObject.tints[weaponTintIndex] then self.loadout[loadoutNum].tintIndex = weaponTintIndex @@ -542,8 +643,10 @@ function CreateExtendedPlayer( end end + ---@param weaponName string + ---@return number function self.getWeaponTint(weaponName) - local _, weapon = self.getWeapon(weaponName) + local _, weapon = self.getWeapon(weaponName) if weapon then return weapon.tintIndex @@ -552,8 +655,10 @@ function CreateExtendedPlayer( return 0 end + ---@param weaponName string + ---@return void function self.removeWeapon(weaponName) - local weaponLabel, playerPed = nil, GetPlayerPed(self.source) + local weaponLabel, playerPed = nil, _GetPlayerPed(self.source) if not playerPed then return print("[^1ERROR^7] xPlayer.removeWeapon ^5invalid^7 player ped!") @@ -568,9 +673,8 @@ function CreateExtendedPlayer( end local weaponHash = joaat(v.name) - - RemoveWeaponFromPed(playerPed, weaponHash) - SetPedAmmo(playerPed, weaponHash, 0) + _RemoveWeaponFromPed(playerPed, weaponHash) + _SetPedAmmo(playerPed, weaponHash, 0) table.remove(self.loadout, k) break @@ -582,11 +686,15 @@ function CreateExtendedPlayer( end end + ---@param weaponName string + ---@param weaponComponent string + ---@return void function self.removeWeaponComponent(weaponName, weaponComponent) - local loadoutNum, weapon = self.getWeapon(weaponName) + local loadoutNum , weapon = self.getWeapon(weaponName) if weapon then - local component = ESX.GetWeaponComponent(weaponName, weaponComponent) + ---@type table + local component = ESX.GetWeaponComponent(weaponName, weaponComponent) if component then if self.hasWeaponComponent(weaponName, weaponComponent) then @@ -604,17 +712,23 @@ function CreateExtendedPlayer( end end + ---@param weaponName string + ---@param ammoCount number + ---@return void function self.removeWeaponAmmo(weaponName, ammoCount) local _, weapon = self.getWeapon(weaponName) if weapon then weapon.ammo = weapon.ammo - ammoCount - self.triggerEvent("esx:setWeaponAmmo", weaponName, weapon.ammo) + _SetPedAmmo(GetPlayerPed(self.source), joaat(weaponName), weapon.ammo) end end + ---@param weaponName string + ---@param weaponComponent string + ---@return boolean function self.hasWeaponComponent(weaponName, weaponComponent) - local _, weapon = self.getWeapon(weaponName) + local _, weapon = self.getWeapon(weaponName) if weapon then for _, v in ipairs(weapon.components) do @@ -623,12 +737,14 @@ function CreateExtendedPlayer( end end - return false - else return false end + + return false end + ---@param weaponName string + ---@return boolean function self.hasWeapon(weaponName) for _, v in ipairs(self.loadout) do if v.name == weaponName then @@ -639,9 +755,11 @@ function CreateExtendedPlayer( return false end + ---@param item string + ---@return table, number | false function self.hasItem(item) for _, v in ipairs(self.inventory) do - if (v.name == item) and (v.count >= 1) then + if v.name == item and v.count >= 1 then return v, v.count end end @@ -649,18 +767,35 @@ function CreateExtendedPlayer( return false end + ---@param weaponName string + ---@return number, table | nil function self.getWeapon(weaponName) for k, v in ipairs(self.loadout) do if v.name == weaponName then return k, v end end + + return nil end + ---@param msg string + ---@param type string + ---@param length number + ---@return void function self.showNotification(msg, notifyType, length) self.triggerEvent("esx:showNotification", msg, notifyType, length) end + ---@param sender string + ---@param subject string + ---@param msg string + ---@param textureDict string + ---@param iconType string + ---@param flash boolean + ---@param saveToBrief boolean + ---@param hudColorIndex number + ---@return void function self.showAdvancedNotification( sender, subject, @@ -684,10 +819,18 @@ function CreateExtendedPlayer( ) end + ---@param msg string + ---@param thisFrame boolean + ---@param beep boolean + ---@param duration number + ---@return void function self.showHelpNotification(msg, thisFrame, beep, duration) self.triggerEvent("esx:showHelpNotification", msg, thisFrame, beep, duration) end + ---@param index any + ---@param subIndex any + ---@return table function self.getMeta(index, subIndex) if not index then return self.metadata @@ -739,6 +882,10 @@ function CreateExtendedPlayer( return metaData end + ---@param index any + ---@param value any + ---@param subValue any + ---@return void function self.setMeta(index, value, subValue) if not index then return print("[^1ERROR^7] xPlayer.setMeta ^5index^7 is Missing!") @@ -748,8 +895,8 @@ function CreateExtendedPlayer( return print("[^1ERROR^7] xPlayer.setMeta ^5index^7 should be ^5string^7!") end - if not value then - return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(value)) + if value == nil then + return print("[^1ERROR^7] xPlayer.setMeta value is missing!") end local _type = type(value) diff --git a/server-data/resources/[esx]/es_extended/server/commands.lua b/server-data/resources/[esx]/es_extended/server/commands.lua index d46363ea4..0d247196e 100644 --- a/server-data/resources/[esx]/es_extended/server/commands.lua +++ b/server-data/resources/[esx]/es_extended/server/commands.lua @@ -3,15 +3,24 @@ ESX.RegisterCommand( "admin", function(xPlayer, args) xPlayer.setCoords({ x = args.x, y = args.y, z = args.z }) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Set Coordinates /setcoords Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "X Coord", value = args.x, inline = true }, + { name = "Y Coord", value = args.y, inline = true }, + { name = "Z Coord", value = args.z, inline = true }, + }) + end end, false, { - help = _U("command_setcoords"), + help = TranslateCap("command_setcoords"), validate = true, arguments = { - { name = "x", help = _U("command_setcoords_x"), type = "coordinate" }, - { name = "y", help = _U("command_setcoords_y"), type = "coordinate" }, - { name = "z", help = _U("command_setcoords_z"), type = "coordinate" }, + { name = "x", help = TranslateCap("command_setcoords_x"), type = "coordinate" }, + { name = "y", help = TranslateCap("command_setcoords_y"), type = "coordinate" }, + { name = "z", help = TranslateCap("command_setcoords_z"), type = "coordinate" }, }, } ) @@ -19,20 +28,30 @@ ESX.RegisterCommand( ESX.RegisterCommand( "setjob", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if not ESX.DoesJobExist(args.job, args.grade) then - return showError(_U("command_setjob_invalid")) + return showError(TranslateCap("command_setjob_invalid")) end + args.playerId.setJob(args.job, args.grade) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Set Job /setjob Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Job", value = args.job, inline = true }, + { name = "Grade", value = args.grade, inline = true }, + }) + end end, true, { - help = _U("command_setjob"), + help = TranslateCap("command_setjob"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "job", help = _U("command_setjob_job"), type = "string" }, - { name = "grade", help = _U("command_setjob_grade"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "job", help = TranslateCap("command_setjob_job"), type = "string" }, + { name = "grade", help = TranslateCap("command_setjob_grade"), type = "number" }, }, } ) @@ -70,6 +89,14 @@ ESX.RegisterCommand( DeleteEntity(playerVehicle) end + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Spawn Car /car Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Vehicle", value = args.car, inline = true }, + }) + end + ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) if networkId then local vehicle = NetworkGetEntityFromNetworkId(networkId) @@ -89,10 +116,10 @@ ESX.RegisterCommand( end, false, { - help = _U("command_car"), + help = TranslateCap("command_car"), validate = false, arguments = { - { name = "car", validate = false, help = _U("command_car_car"), type = "string" }, + { name = "car", validate = false, help = TranslateCap("command_car_car"), type = "string" }, }, } ) @@ -113,13 +140,19 @@ ESX.RegisterCommand( DeleteEntity(Vehicle) end end + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Delete Vehicle /dv Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + }) + end end, false, { - help = _U("command_cardel"), + help = TranslateCap("command_cardel"), validate = false, arguments = { - { name = "radius", validate = false, help = _U("command_cardel_radius"), type = "number" }, + { name = "radius", validate = false, help = TranslateCap("command_cardel_radius"), type = "number" }, }, } ) @@ -132,21 +165,28 @@ ESX.RegisterCommand( local ped = GetPlayerPed(xTarget.source) local pedVehicle = GetVehiclePedIsIn(ped, false) if not pedVehicle or GetPedInVehicleSeat(pedVehicle, -1) ~= ped then - showError(_U("not_in_vehicle")) + showError(TranslateCap("not_in_vehicle")) return end xTarget.triggerEvent("esx:repairPedVehicle") - xPlayer.showNotification(_U("command_repair_success"), true, false, 140) + xPlayer.showNotification(TranslateCap("command_repair_success"), true, false, 140) if xPlayer.source ~= xTarget.source then - xTarget.showNotification(_U("command_repair_success_target"), true, false, 140) + xTarget.showNotification(TranslateCap("command_repair_success_target"), true, false, 140) + end + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Fix Vehicle /fix Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = xTarget.name, inline = true }, + }) end end, true, { - help = _U("command_repair"), + help = TranslateCap("command_repair"), validate = false, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -154,20 +194,29 @@ ESX.RegisterCommand( ESX.RegisterCommand( "setaccountmoney", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if not args.playerId.getAccount(args.account) then - return showError(_U("command_giveaccountmoney_invalid")) + return showError(TranslateCap("command_giveaccountmoney_invalid")) end args.playerId.setAccountMoney(args.account, args.amount, "Government Grant") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Set Account Money /setaccountmoney Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Account", value = args.account, inline = true }, + { name = "Amount", value = args.amount, inline = true }, + }) + end end, true, { - help = _U("command_setaccountmoney"), + help = TranslateCap("command_setaccountmoney"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "account", help = _U("command_giveaccountmoney_account"), type = "string" }, - { name = "amount", help = _U("command_setaccountmoney_amount"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "account", help = TranslateCap("command_giveaccountmoney_account"), type = "string" }, + { name = "amount", help = TranslateCap("command_setaccountmoney_amount"), type = "number" }, }, } ) @@ -175,20 +224,29 @@ ESX.RegisterCommand( ESX.RegisterCommand( "giveaccountmoney", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if not args.playerId.getAccount(args.account) then - return showError(_U("command_giveaccountmoney_invalid")) + return showError(TranslateCap("command_giveaccountmoney_invalid")) end args.playerId.addAccountMoney(args.account, args.amount, "Government Grant") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Give Account Money /giveaccountmoney Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Account", value = args.account, inline = true }, + { name = "Amount", value = args.amount, inline = true }, + }) + end end, true, { - help = _U("command_giveaccountmoney"), + help = TranslateCap("command_giveaccountmoney"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "account", help = _U("command_giveaccountmoney_account"), type = "string" }, - { name = "amount", help = _U("command_giveaccountmoney_amount"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "account", help = TranslateCap("command_giveaccountmoney_account"), type = "string" }, + { name = "amount", help = TranslateCap("command_giveaccountmoney_amount"), type = "number" }, }, } ) @@ -196,20 +254,29 @@ ESX.RegisterCommand( ESX.RegisterCommand( "removeaccountmoney", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if not args.playerId.getAccount(args.account) then - return showError(_U("command_removeaccountmoney_invalid")) + return showError(TranslateCap("command_removeaccountmoney_invalid")) end args.playerId.removeAccountMoney(args.account, args.amount, "Government Tax") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Remove Account Money /removeaccountmoney Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Account", value = args.account, inline = true }, + { name = "Amount", value = args.amount, inline = true }, + }) + end end, true, { - help = _U("command_removeaccountmoney"), + help = TranslateCap("command_removeaccountmoney"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "account", help = _U("command_removeaccountmoney_account"), type = "string" }, - { name = "amount", help = _U("command_removeaccountmoney_amount"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "account", help = TranslateCap("command_removeaccountmoney_account"), type = "string" }, + { name = "amount", help = TranslateCap("command_removeaccountmoney_amount"), type = "number" }, }, } ) @@ -218,17 +285,26 @@ if not Config.OxInventory then ESX.RegisterCommand( "giveitem", "admin", - function(_, args) + function(xPlayer, args) args.playerId.addInventoryItem(args.item, args.count) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Give Item /giveitem Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Item", value = args.item, inline = true }, + { name = "Quantity", value = args.count, inline = true }, + }) + end end, true, { - help = _U("command_giveitem"), + help = TranslateCap("command_giveitem"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "item", help = _U("command_giveitem_item"), type = "item" }, - { name = "count", help = _U("command_giveitem_count"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "item", help = TranslateCap("command_giveitem_item"), type = "item" }, + { name = "count", help = TranslateCap("command_giveitem_count"), type = "number" }, }, } ) @@ -236,20 +312,29 @@ if not Config.OxInventory then ESX.RegisterCommand( "giveweapon", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if args.playerId.hasWeapon(args.weapon) then - return showError(_U("command_giveweapon_hasalready")) + return showError(TranslateCap("command_giveweapon_hasalready")) end args.playerId.addWeapon(args.weapon, args.ammo) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Give Weapon /giveweapon Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Weapon", value = args.weapon, inline = true }, + { name = "Ammo", value = args.ammo, inline = true }, + }) + end end, true, { - help = _U("command_giveweapon"), + help = TranslateCap("command_giveweapon"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "weapon", help = _U("command_giveweapon_weapon"), type = "weapon" }, - { name = "ammo", help = _U("command_giveweapon_ammo"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "weapon", help = TranslateCap("command_giveweapon_weapon"), type = "weapon" }, + { name = "ammo", help = TranslateCap("command_giveweapon_ammo"), type = "number" }, }, } ) @@ -257,20 +342,29 @@ if not Config.OxInventory then ESX.RegisterCommand( "giveammo", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if not args.playerId.hasWeapon(args.weapon) then - return showError(_U("command_giveammo_noweapon_found")) + return showError(TranslateCap("command_giveammo_noweapon_found")) end args.playerId.addWeaponAmmo(args.weapon, args.ammo) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Give Ammunition /giveammo Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Weapon", value = args.weapon, inline = true }, + { name = "Ammo", value = args.ammo, inline = true }, + }) + end end, true, { - help = _U("command_giveweapon"), + help = TranslateCap("command_giveweapon"), validate = false, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "weapon", help = _U("command_giveammo_weapon"), type = "weapon" }, - { name = "ammo", help = _U("command_giveammo_ammo"), type = "number" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "weapon", help = TranslateCap("command_giveammo_weapon"), type = "weapon" }, + { name = "ammo", help = TranslateCap("command_giveammo_ammo"), type = "number" }, }, } ) @@ -278,31 +372,53 @@ if not Config.OxInventory then ESX.RegisterCommand( "giveweaponcomponent", "admin", - function(_, args, showError) + function(xPlayer, args, showError) if args.playerId.hasWeapon(args.weaponName) then local component = ESX.GetWeaponComponent(args.weaponName, args.componentName) if component then if args.playerId.hasWeaponComponent(args.weaponName, args.componentName) then - showError(_U("command_giveweaponcomponent_hasalready")) + showError(TranslateCap("command_giveweaponcomponent_hasalready")) else args.playerId.addWeaponComponent(args.weaponName, args.componentName) + if Config.AdminLogging then + ESX.DiscordLogFields( + "UserActions", + "Give Weapon Component /giveweaponcomponent Triggered!", + "pink", + { + { + name = "Player", + value = xPlayer and xPlayer.name or "Server Console", + inline = true, + }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Weapon", value = args.weaponName, inline = true }, + { name = "Component", value = args.componentName, inline = true }, + } + ) + end end else - showError(_U("command_giveweaponcomponent_invalid")) + showError(TranslateCap("command_giveweaponcomponent_invalid")) end else - showError(_U("command_giveweaponcomponent_missingweapon")) + showError(TranslateCap("command_giveweaponcomponent_missingweapon")) end end, true, { - help = _U("command_giveweaponcomponent"), + help = TranslateCap("command_giveweaponcomponent"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "weaponName", help = _U("command_giveweapon_weapon"), type = "weapon" }, - { name = "componentName", help = _U("command_giveweaponcomponent_component"), type = "string" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "weaponName", help = TranslateCap("command_giveweapon_weapon"), type = "weapon" }, + { + name = "componentName", + help = TranslateCap("command_giveweaponcomponent_component"), + type = "string", + }, }, } ) @@ -310,34 +426,47 @@ end ESX.RegisterCommand({ "clear", "cls" }, "user", function(xPlayer) xPlayer.triggerEvent("chat:clear") -end, false, { help = _U("command_clear") }) +end, false, { help = TranslateCap("command_clear") }) -ESX.RegisterCommand({ "clearall", "clsall" }, "admin", function() +ESX.RegisterCommand({ "clearall", "clsall" }, "admin", function(xPlayer) TriggerClientEvent("chat:clear", -1) -end, true, { help = _U("command_clearall") }) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Clear Chat /clearall Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + }) + end +end, true, { help = TranslateCap("command_clearall") }) ESX.RegisterCommand("refreshjobs", "admin", function() ESX.RefreshJobs() -end, true, { help = _U("command_clearall") }) +end, true, { help = TranslateCap("command_clearall") }) if not Config.OxInventory then ESX.RegisterCommand( "clearinventory", "admin", - function(_, args) + function(xPlayer, args) for _, v in ipairs(args.playerId.inventory) do if v.count > 0 then args.playerId.setInventoryItem(v.name, 0) end end TriggerEvent("esx:playerInventoryCleared", args.playerId) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Clear Inventory /clearinventory Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + }) + end end, true, { - help = _U("command_clearinventory"), + help = TranslateCap("command_clearinventory"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -345,18 +474,25 @@ if not Config.OxInventory then ESX.RegisterCommand( "clearloadout", "admin", - function(_, args) + function(xPlayer, args) for i = #args.playerId.loadout, 1, -1 do args.playerId.removeWeapon(args.playerId.loadout[i].name) end TriggerEvent("esx:playerLoadoutCleared", args.playerId) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "/clearloadout Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + }) + end end, true, { - help = _U("command_clearloadout"), + help = TranslateCap("command_clearloadout"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -374,14 +510,22 @@ ESX.RegisterCommand( print("[^3WARNING^7] ^5Superadmin^7 detected, setting group to ^5admin^7") end args.playerId.setGroup(args.group) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "/setgroup Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Group", value = args.group, inline = true }, + }) + end end, true, { - help = _U("command_setgroup"), + help = TranslateCap("command_setgroup"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, - { name = "group", help = _U("command_setgroup_group"), type = "string" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, + { name = "group", help = TranslateCap("command_setgroup_group"), type = "string" }, }, } ) @@ -395,23 +539,23 @@ ESX.RegisterCommand( end, true, { - help = _U("command_save"), + help = TranslateCap("command_save"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) ESX.RegisterCommand("saveall", "admin", function() Core.SavePlayers() -end, true, { help = _U("command_saveall") }) +end, true, { help = TranslateCap("command_saveall") }) -ESX.RegisterCommand("group", { "user", "admin" }, function(xPlayer) +ESX.RegisterCommand("group", { "user", "admin" }, function(xPlayer, _, _) print(("%s, you are currently: ^5%s^0"):format(xPlayer.getName(), xPlayer.getGroup())) end, true) -ESX.RegisterCommand("job", { "user", "admin" }, function(xPlayer) +ESX.RegisterCommand("job", { "user", "admin" }, function(xPlayer, _, _) print( ("%s, your job is: ^5%s^0 - ^5%s^0"):format( xPlayer.getName(), @@ -419,7 +563,7 @@ ESX.RegisterCommand("job", { "user", "admin" }, function(xPlayer) xPlayer.getJob().grade_label ) ) -end, true) +end, false) ESX.RegisterCommand("info", { "user", "admin" }, function(xPlayer) local job = xPlayer.getJob().name @@ -431,7 +575,7 @@ ESX.RegisterCommand("info", { "user", "admin" }, function(xPlayer) job ) ) -end, true) +end, false) ESX.RegisterCommand("coords", "admin", function(xPlayer) local ped = GetPlayerPed(xPlayer.source) @@ -439,11 +583,17 @@ ESX.RegisterCommand("coords", "admin", function(xPlayer) local heading = GetEntityHeading(ped) print(("Coords - Vector3: ^5%s^0"):format(vector3(coords.x, coords.y, coords.z))) print(("Coords - Vector4: ^5%s^0"):format(vector4(coords.x, coords.y, coords.z, heading))) -end, true) +end, false) ESX.RegisterCommand("tpm", "admin", function(xPlayer) xPlayer.triggerEvent("esx:tpm") -end, true) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin Teleport /tpm Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + }) + end +end, false) ESX.RegisterCommand( "goto", @@ -451,13 +601,21 @@ ESX.RegisterCommand( function(xPlayer, args) local targetCoords = args.playerId.getCoords() xPlayer.setCoords(targetCoords) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin Teleport /goto Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Target Coords", value = targetCoords, inline = true }, + }) + end end, - true, + false, { - help = _U("command_goto"), + help = TranslateCap("command_goto"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -466,15 +624,24 @@ ESX.RegisterCommand( "bring", "admin", function(xPlayer, args) + local targetCoords = args.playerId.getCoords() local playerCoords = xPlayer.getCoords() args.playerId.setCoords(playerCoords) + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin Teleport /bring Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + { name = "Target Coords", value = targetCoords, inline = true }, + }) + end end, - true, + false, { - help = _U("command_bring"), + help = TranslateCap("command_bring"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -482,15 +649,22 @@ ESX.RegisterCommand( ESX.RegisterCommand( "kill", "admin", - function(_, args) + function(xPlayer, args) args.playerId.triggerEvent("esx:killPlayer") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Kill Command /kill Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + }) + end end, true, { - help = _U("command_kill"), + help = TranslateCap("command_kill"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -498,15 +672,22 @@ ESX.RegisterCommand( ESX.RegisterCommand( "freeze", "admin", - function(_, args) + function(xPlayer, args) args.playerId.triggerEvent("esx:freezePlayer", "freeze") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin Freeze /freeze Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + }) + end end, true, { - help = _U("command_freeze"), + help = TranslateCap("command_freeze"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) @@ -514,21 +695,34 @@ ESX.RegisterCommand( ESX.RegisterCommand( "unfreeze", "admin", - function(_, args) + function(xPlayer, args) args.playerId.triggerEvent("esx:freezePlayer", "unfreeze") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin UnFreeze /unfreeze Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + { name = "Target", value = args.playerId.name, inline = true }, + }) + end end, true, { - help = _U("command_unfreeze"), + help = TranslateCap("command_unfreeze"), validate = true, arguments = { - { name = "playerId", help = _U("commandgeneric_playerid"), type = "player" }, + { name = "playerId", help = TranslateCap("commandgeneric_playerid"), type = "player" }, }, } ) ESX.RegisterCommand("noclip", "admin", function(xPlayer) xPlayer.triggerEvent("esx:noclip") + if Config.AdminLogging then + ESX.DiscordLogFields("UserActions", "Admin NoClip /noclip Triggered!", "pink", { + { name = "Player", value = xPlayer and xPlayer.name or "Server Console", inline = true }, + { name = "ID", value = xPlayer and xPlayer.source or "Unknown ID", inline = true }, + }) + end end, false) ESX.RegisterCommand("players", "admin", function() diff --git a/server-data/resources/[esx]/es_extended/server/common.lua b/server-data/resources/[esx]/es_extended/server/common.lua index 685d680d7..b1bce25b8 100644 --- a/server-data/resources/[esx]/es_extended/server/common.lua +++ b/server-data/resources/[esx]/es_extended/server/common.lua @@ -1,35 +1,37 @@ ESX = {} ESX.Players = {} ESX.Jobs = {} +ESX.JobsPlayerCount = {} ESX.Items = {} Core = {} Core.UsableItemsCallbacks = {} -Core.ServerCallbacks = {} -Core.ClientCallbacks = {} -Core.CurrentRequestId = 0 -Core.TimeoutCount = -1 -Core.CancelledTimeouts = {} Core.RegisteredCommands = {} Core.Pickups = {} Core.PickupId = 0 Core.PlayerFunctionOverrides = {} +Core.DatabaseConnected = false +Core.playersByIdentifier = {} -AddEventHandler("esx:getSharedObject", function(cb) +Core.vehicleTypesByModel = {} + +RegisterNetEvent("esx:onPlayerSpawn", function() + ESX.Players[source].spawned = true +end) + +AddEventHandler("esx:getSharedObject", function() local Invoke = GetInvokingResource() print( - ("[^3WARNING^7] ^5%s^7 used ^5esx:getSharedObject^7, this method is obsolete, refer to ^5https://bitpredator.github.io/bptdevelopment/docs/esx-tutorial/sharedevent^7 for more info!"):format( + ("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://bitpredator.github.io/bptdevelopment/docs/esx-tutorial/sharedevent for how to fix!"):format( Invoke ) ) - cb(ESX) end) exports("getSharedObject", function() return ESX end) -if GetResourceState("ox_inventory") ~= "missing" then - Config.OxInventory = true +if Config.OxInventory then Config.PlayerFunctionOverride = "OxInventory" SetConvarReplicated("inventory:framework", "esx") SetConvarReplicated("inventory:weight", Config.MaxWeight * 1000) @@ -37,14 +39,16 @@ end local function StartDBSync() CreateThread(function() + local interval = 10 * 60 * 1000 while true do - Wait(10 * 60 * 1000) + Wait(interval) Core.SavePlayers() end end) end MySQL.ready(function() + Core.DatabaseConnected = true if not Config.OxInventory then local items = MySQL.query.await("SELECT * FROM items") for _, v in ipairs(items) do @@ -66,44 +70,18 @@ MySQL.ready(function() end end - local Jobs = {} - local jobs = MySQL.query.await("SELECT * FROM jobs") - - for _, v in ipairs(jobs) do - Jobs[v.name] = v - Jobs[v.name].grades = {} - end - - local jobGrades = MySQL.query.await("SELECT * FROM job_grades") + ESX.RefreshJobs() - for _, v in ipairs(jobGrades) do - if Jobs[v.job_name] then - Jobs[v.job_name].grades[tostring(v.grade)] = v - else - print(("[^3WARNING^7] Ignoring job grades for ^5%s^0 due to missing job"):format(v.job_name)) - end - end - - for _, v in pairs(Jobs) do - if ESX.Table.SizeOf(v.grades) == 0 then - Jobs[v.name] = nil - print(("[^3WARNING^7] Ignoring job ^5%s^0 due to no job grades found"):format(v.name)) - end - end - - if not Jobs then - -- Fallback data, if no jobs exist - ESX.Jobs["unemployed"] = { - label = "Unemployed", - grades = { ["0"] = { grade = 0, label = "Unemployed", salary = 200, skin_male = {}, skin_female = {} } }, - } - else - ESX.Jobs = Jobs - end + print( + ("[^2INFO^7] ESX ^5Legacy %s^0 initialized!"):format( + GetResourceMetadata(GetCurrentResourceName(), "version", 0) + ) + ) - print("[^2INFO^7] BPT ^5FRAMEWORK^0 INITIALIZED") StartDBSync() - StartPayCheck() + if Config.EnablePaycheck then + StartPayCheck() + end end) RegisterServerEvent("esx:clientLog") @@ -113,15 +91,6 @@ AddEventHandler("esx:clientLog", function(msg) end end) -RegisterServerEvent("esx:triggerServerCallback") -AddEventHandler("esx:triggerServerCallback", function(name, requestId, Invoke, ...) - local source = source - - ESX.TriggerServerCallback(name, requestId, source, Invoke, function(...) - TriggerClientEvent("esx:serverCallback", source, requestId, ...) - end, ...) -end) - RegisterNetEvent("esx:ReturnVehicleType", function(Type, Request) if Core.ClientCallbacks[Request] then Core.ClientCallbacks[Request](Type) diff --git a/server-data/resources/[esx]/es_extended/server/functions.lua b/server-data/resources/[esx]/es_extended/server/functions.lua index 8a6dbcdc6..28a5cb7cf 100644 --- a/server-data/resources/[esx]/es_extended/server/functions.lua +++ b/server-data/resources/[esx]/es_extended/server/functions.lua @@ -4,22 +4,6 @@ function ESX.Trace(msg) end end -function ESX.SetTimeout(msec, cb) - local id = Core.TimeoutCount + 1 - - SetTimeout(msec, function() - if Core.CancelledTimeouts[id] then - Core.CancelledTimeouts[id] = nil - else - cb() - end - end) - - Core.TimeoutCount = id - - return id -end - function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) if type(name) == "table" then for _, v in ipairs(name) do @@ -54,16 +38,17 @@ function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) local command = Core.RegisteredCommands[name] if not command.allowConsole and playerId == 0 then - print(("[^3WARNING^7] ^5%s"):format(_U("commanderror_console"))) + print(("[^3WARNING^7] ^5%s"):format(TranslateCap("commanderror_console"))) else local xPlayer, error = ESX.Players[playerId], nil if command.suggestion then if command.suggestion.validate then if #args ~= #command.suggestion.arguments then - error = _U("commanderror_argumentmismatch", #args, #command.suggestion.arguments) + error = TranslateCap("commanderror_argumentmismatch", #args, #command.suggestion.arguments) end end + if not error and command.suggestion.arguments then local newArgs = {} @@ -75,7 +60,7 @@ function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) if newArg then newArgs[v.name] = newArg else - error = _U("commanderror_argumentmismatch_number", k) + error = TranslateCap("commanderror_argumentmismatch_number", k) end elseif v.type == "player" or v.type == "playerId" then local targetPlayer = tonumber(args[k]) @@ -94,31 +79,52 @@ function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) newArgs[v.name] = targetPlayer end else - error = _U("commanderror_invalidplayerid") + error = TranslateCap("commanderror_invalidplayerid") end else - error = _U("commanderror_argumentmismatch_number", k) + error = TranslateCap("commanderror_argumentmismatch_number", k) end elseif v.type == "string" then - newArgs[v.name] = args[k] + local newArg = tonumber(args[k]) + if not newArg then + newArgs[v.name] = args[k] + else + error = TranslateCap("commanderror_argumentmismatch_string", k) + end elseif v.type == "item" then if ESX.Items[args[k]] then newArgs[v.name] = args[k] else - error = _U("commanderror_invaliditem") + error = TranslateCap("commanderror_invaliditem") end elseif v.type == "weapon" then if ESX.GetWeapon(args[k]) then newArgs[v.name] = string.upper(args[k]) else - error = _U("commanderror_invalidweapon") + error = TranslateCap("commanderror_invalidweapon") end elseif v.type == "any" then newArgs[v.name] = args[k] + elseif v.type == "merge" then + local lenght = 0 + for i = 1, k - 1 do + lenght = lenght + string.len(args[i]) + 1 + end + local merge = table.concat(args, " ") + + newArgs[v.name] = string.sub(merge, lenght) + elseif v.type == "coordinate" then + local coord = tonumber(args[k]:match("(-?%d+%.?%d*)")) + if not coord then + error = TranslateCap("commanderror_argumentmismatch_number", k) + else + newArgs[v.name] = coord + end end end - if not v.validate then + --backwards compatibility + if v.validate ~= nil and not v.validate then error = nil end @@ -158,28 +164,18 @@ function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) end end -function ESX.ClearTimeout(id) - Core.CancelledTimeouts[id] = true +local function updateHealthAndArmorInMetadata(xPlayer) + local ped = GetPlayerPed(xPlayer.source) + xPlayer.setMeta("health", GetEntityHealth(ped)) + xPlayer.setMeta("armor", GetPedArmour(ped)) end -function ESX.RegisterServerCallback(name, cb) - Core.ServerCallbacks[name] = cb -end - -function ESX.TriggerServerCallback(name, _, source, Invoke, cb, ...) - if Core.ServerCallbacks[name] then - Core.ServerCallbacks[name](source, cb, ...) - else - print( - ('[^1ERROR^7] Server callback ^5"%s"^0 does not exist. Please Check ^5%s^7 for Errors!'):format( - name, - Invoke - ) - ) +function Core.SavePlayer(xPlayer, cb) + if not xPlayer.spawned then + return cb and cb() end -end -function Core.SavePlayer(xPlayer, cb) + updateHealthAndArmorInMetadata(xPlayer) local parameters = { json.encode(xPlayer.getAccounts(true)), xPlayer.job.name, @@ -188,11 +184,12 @@ function Core.SavePlayer(xPlayer, cb) json.encode(xPlayer.getCoords()), json.encode(xPlayer.getInventory(true)), json.encode(xPlayer.getLoadout(true)), + json.encode(xPlayer.getMeta()), xPlayer.identifier, } MySQL.prepare( - "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?", + "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ?, `metadata` = ? WHERE `identifier` = ?", parameters, function(affectedRows) if affectedRows == 1 then @@ -211,10 +208,12 @@ function Core.SavePlayers(cb) if not next(xPlayers) then return end + local startTime = os.time() local parameters = {} for _, xPlayer in pairs(ESX.Players) do + updateHealthAndArmorInMetadata(xPlayer) parameters[#parameters + 1] = { json.encode(xPlayer.getAccounts(true)), xPlayer.job.name, @@ -223,12 +222,13 @@ function Core.SavePlayers(cb) json.encode(xPlayer.getCoords()), json.encode(xPlayer.getInventory(true)), json.encode(xPlayer.getLoadout(true)), + json.encode(xPlayer.getMeta()), xPlayer.identifier, } end MySQL.prepare( - "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?", + "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ?, `metadata` = ? WHERE `identifier` = ?", parameters, function(results) if not results then @@ -251,45 +251,208 @@ function Core.SavePlayers(cb) end ESX.GetPlayers = GetPlayers + +local function checkTable(key, val, player, xPlayers) + for valIndex = 1, #val do + local value = val[valIndex] + if not xPlayers[value] then + xPlayers[value] = {} + end + + if (key == "job" and player.job.name == value) or player[key] == value then + xPlayers[value][#xPlayers[value] + 1] = player + end + end +end + function ESX.GetExtendedPlayers(key, val) local xPlayers = {} - for _, v in pairs(ESX.Players) do - if key then - if (key == "job" and v.job.name == val) or v[key] == val then + if type(val) == "table" then + for _, v in pairs(ESX.Players) do + checkTable(key, val, v, xPlayers) + end + else + for _, v in pairs(ESX.Players) do + if key then + if (key == "job" and v.job.name == val) or v[key] == val then + xPlayers[#xPlayers + 1] = v + end + else xPlayers[#xPlayers + 1] = v end - else - xPlayers[#xPlayers + 1] = v end end + return xPlayers end +function ESX.GetNumPlayers(key, val) + if not key then + return #GetPlayers() + end + + if type(val) == "table" then + local numPlayers = {} + if key == "job" then + for _, v in ipairs(val) do + numPlayers[v] = (ESX.JobsPlayerCount[v] or 0) + end + return numPlayers + end + + local filteredPlayers = ESX.GetExtendedPlayers(key, val) + for i, v in pairs(filteredPlayers) do + numPlayers[i] = (#v or 0) + end + return numPlayers + end + + if key == "job" then + return (ESX.JobsPlayerCount[val] or 0) + end + + return #ESX.GetExtendedPlayers(key, val) +end + function ESX.GetPlayerFromId(source) return ESX.Players[tonumber(source)] end function ESX.GetPlayerFromIdentifier(identifier) - for _, v in pairs(ESX.Players) do - if v.identifier == identifier then - return v - end - end + return Core.playersByIdentifier[identifier] end function ESX.GetIdentifier(playerId) local fxDk = GetConvarInt("sv_fxdkMode", 0) if fxDk == 1 then - return "BPT-DEBUG-LICENCE" + return "ESX-DEBUG-LICENCE" end + local identifier = GetPlayerIdentifierByType(playerId, "license") return identifier and identifier:gsub("license:", "") end -function ESX.GetVehicleType(Vehicle, Player, cb) - Core.CurrentRequestId = Core.CurrentRequestId < 65535 and Core.CurrentRequestId + 1 or 0 - Core.ClientCallbacks[Core.CurrentRequestId] = cb - TriggerClientEvent("esx:GetVehicleType", Player, Vehicle, Core.CurrentRequestId) +---@param model string|number +---@param player number playerId +---@param cb function + +function ESX.GetVehicleType(model, player, cb) + model = type(model) == "string" and joaat(model) or model + + if Core.vehicleTypesByModel[model] then + return cb(Core.vehicleTypesByModel[model]) + end + + ESX.TriggerClientCallback(player, "esx:GetVehicleType", function(vehicleType) + Core.vehicleTypesByModel[model] = vehicleType + cb(vehicleType) + end, model) +end + +function ESX.DiscordLog(name, title, color, message) + local webHook = Config.DiscordLogs.Webhooks[name] or Config.DiscordLogs.Webhooks.default + local embedData = { + { + ["title"] = title, + ["color"] = Config.DiscordLogs.Colors[color] or Config.DiscordLogs.Colors.default, + ["footer"] = { + ["text"] = "| ESX Logs | " .. os.date(), + ["icon_url"] = "https://cdn.discordapp.com/attachments/944789399852417096/1020099828266586193/blanc-800x800.png", + }, + ["description"] = message, + ["author"] = { + ["name"] = "ESX Framework", + ["icon_url"] = "https://cdn.discordapp.com/emojis/939245183621558362.webp?size=128&quality=lossless", + }, + }, + } + PerformHttpRequest( + webHook, + nil, + "POST", + json.encode({ + username = "Logs", + embeds = embedData, + }), + { + ["Content-Type"] = "application/json", + } + ) +end + +function ESX.DiscordLogFields(name, title, color, fields) + local webHook = Config.DiscordLogs.Webhooks[name] or Config.DiscordLogs.Webhooks.default + local embedData = { + { + ["title"] = title, + ["color"] = Config.DiscordLogs.Colors[color] or Config.DiscordLogs.Colors.default, + ["footer"] = { + ["text"] = "| ESX Logs | " .. os.date(), + ["icon_url"] = "https://cdn.discordapp.com/attachments/944789399852417096/1020099828266586193/blanc-800x800.png", + }, + ["fields"] = fields, + ["description"] = "", + ["author"] = { + ["name"] = "ESX Framework", + ["icon_url"] = "https://cdn.discordapp.com/emojis/939245183621558362.webp?size=128&quality=lossless", + }, + }, + } + PerformHttpRequest( + webHook, + nil, + "POST", + json.encode({ + username = "Logs", + embeds = embedData, + }), + { + ["Content-Type"] = "application/json", + } + ) +end + +--- Create Job at Runtime +--- @param name string +--- @param label string +--- @param grades table +function ESX.CreateJob(name, label, grades) + if not name then + return print("[^3WARNING^7] missing argument `name(string)` while creating a job") + end + + if not label then + return print("[^3WARNING^7] missing argument `label(string)` while creating a job") + end + + if not grades or not next(grades) then + return print("[^3WARNING^7] missing argument `grades(table)` while creating a job!") + end + + local parameters = {} + local job = { name = name, label = label, grades = {} } + + for _, v in pairs(grades) do + job.grades[tostring(v.grade)] = { + job_name = name, + grade = v.grade, + name = v.name, + label = v.label, + salary = v.salary, + skin_male = v.skin_male or "{}", + skin_female = v.skin_female or "{}", + } + parameters[#parameters + 1] = + { name, v.grade, v.name, v.label, v.salary, v.skin_male or "{}", v.skin_female or "{}" } + end + + MySQL.insert("INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)", { name, label }) + MySQL.prepare( + "INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)", + parameters + ) + + ESX.Jobs[name] = job end function ESX.RefreshJobs() @@ -377,7 +540,7 @@ function ESX.GetItemLabel(item) if ESX.Items[item] then return ESX.Items[item].label else - print("[^3WARNING^7] Attemting to get invalid Item -> ^5" .. item .. "^7") + print(("[^3WARNING^7] Attemting to get invalid Item -> ^5%s^7"):format(item)) end end @@ -394,25 +557,33 @@ function ESX.GetUsableItems() end if not Config.OxInventory then - function ESX.CreatePickup(type, name, count, label, playerId, components, tintIndex) + function ESX.CreatePickup(itemType, name, count, label, playerId, components, tintIndex, coords) local pickupId = (Core.PickupId == 65635 and 0 or Core.PickupId + 1) local xPlayer = ESX.Players[playerId] - local coords = xPlayer.getCoords() + coords = ((type(coords) == "vector3" or type(coords) == "vector4") and coords.xyz or xPlayer.getCoords(true)) - Core.Pickups[pickupId] = { type = type, name = name, count = count, label = label, coords = coords } + Core.Pickups[pickupId] = { type = itemType, name = name, count = count, label = label, coords = coords } - if type == "item_weapon" then + if itemType == "item_weapon" then Core.Pickups[pickupId].components = components Core.Pickups[pickupId].tintIndex = tintIndex end - TriggerClientEvent("esx:createPickup", -1, pickupId, label, coords, type, name, components, tintIndex) + TriggerClientEvent("esx:createPickup", -1, pickupId, label, coords, itemType, name, components, tintIndex) Core.PickupId = pickupId end end function ESX.DoesJobExist(job, grade) - return (ESX.Jobs[job] and ESX.Jobs[job].grades[tostring(grade)] ~= nil) or false + grade = tostring(grade) + + if job and grade then + if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then + return true + end + end + + return false end function Core.IsPlayerAdmin(playerId) @@ -423,7 +594,7 @@ function Core.IsPlayerAdmin(playerId) local xPlayer = ESX.Players[playerId] if xPlayer then - if xPlayer.group == "admin" then + if Config.AdminGroups[xPlayer.group] then return true end end diff --git a/server-data/resources/[esx]/es_extended/server/main.lua b/server-data/resources/[esx]/es_extended/server/main.lua index f85209e16..94cf18637 100644 --- a/server-data/resources/[esx]/es_extended/server/main.lua +++ b/server-data/resources/[esx]/es_extended/server/main.lua @@ -3,12 +3,17 @@ SetGameType("BPT FRAMEWORK") local oneSyncState = GetConvar("onesync", "off") local newPlayer = "INSERT INTO `users` SET `accounts` = ?, `identifier` = ?, `group` = ?" -local loadPlayer = "SELECT `accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`" +local loadPlayer = + "SELECT `accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`, `metadata`" if Config.Multichar then newPlayer = newPlayer .. ", `firstname` = ?, `lastname` = ?, `dateofbirth` = ?, `sex` = ?, `height` = ?" end +if Config.StartingInventoryItems then + newPlayer = newPlayer .. ", `inventory` = ?" +end + if Config.Multichar or Config.Identity then loadPlayer = loadPlayer .. ", `firstname`, `lastname`, `dateofbirth`, `sex`, `height`" end @@ -83,24 +88,26 @@ function createESXPlayer(identifier, playerId, data) defaultGroup = "admin" end - if not Config.Multichar then - MySQL.prepare(newPlayer, { json.encode(accounts), identifier, defaultGroup }, function() - loadESXPlayer(identifier, playerId, true) - end) - else - MySQL.prepare(newPlayer, { - json.encode(accounts), - identifier, - defaultGroup, - data.firstname, - data.lastname, - data.dateofbirth, - data.sex, - data.height, - }, function() - loadESXPlayer(identifier, playerId, true) - end) + local parameters = Config.Multichar + and { + json.encode(accounts), + identifier, + defaultGroup, + data.firstname, + data.lastname, + data.dateofbirth, + data.sex, + data.height, + } + or { json.encode(accounts), identifier, defaultGroup } + + if Config.StartingInventoryItems then + table.insert(parameters, json.encode(Config.StartingInventoryItems)) end + + MySQL.prepare(newPlayer, parameters, function() + loadESXPlayer(identifier, playerId, true) + end) end if not Config.Multichar then @@ -119,58 +126,55 @@ if not Config.Multichar then if not Core.DatabaseConnected then return deferrals.done( - ("[ESX] ESX Cannot Connect to your database. Please make sure it is correctly configured in your server.cfg"):format( - oneSyncState - ) + "[ESX] OxMySQL Was Unable To Connect to your database. Please make sure it is turned on and correctly configured in your server.cfg" ) end if identifier then if ESX.GetPlayerFromIdentifier(identifier) then - deferrals.done( - ("There was an error loading your character!\nError code: identifier-active\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same account.\n\nYour identifier: %s"):format( + return deferrals.done( + ("[ESX] There was an error loading your character!\nError code: identifier-active\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same account.\n\nYour identifier: %s"):format( identifier ) ) else - deferrals.done() + return deferrals.done() end else - deferrals.done( - "There was an error loading your character!\nError code: identifier-missing\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team." + return deferrals.done( + "[ESX] There was an error loading your character!\nError code: identifier-missing\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team." ) end end) end function loadESXPlayer(identifier, playerId, isNew) - local userData = - { accounts = {}, inventory = {}, job = {}, loadout = {}, playerName = GetPlayerName(playerId), weight = 0 } + local userData = { + accounts = {}, + inventory = {}, + loadout = {}, + weight = 0, + identifier = identifier, + firstName = "John", + lastName = "Doe", + dateofbirth = "01/01/2000", + height = 120, + dead = false, + } local result = MySQL.prepare.await(loadPlayer, { identifier }) - local job, grade, duty = - result.job, - tostring(result.job_grade), - result.job_duty and (result.job_duty == 1 and true or result.job_duty == 0 and false) - local foundAccounts, foundItems = {}, {} -- Accounts - if result.accounts and result.accounts ~= "" then - local accounts = json.decode(result.accounts) - - for account, money in pairs(accounts) do - foundAccounts[account] = money - end - end + local accounts = result.accounts + accounts = (accounts and accounts ~= "") and json.decode(accounts) or {} for account, data in pairs(Config.Accounts) do - if data.round == nil then - data.round = true - end + data.round = data.round or data.round == nil + local index = #userData.accounts + 1 userData.accounts[index] = { name = account, - money = foundAccounts[account] or Config.StartingAccountMoney[account] or 0, + money = accounts[account] or Config.StartingAccountMoney[account] or 0, label = data.label, round = data.round, index = index, @@ -178,8 +182,9 @@ function loadESXPlayer(identifier, playerId, isNew) end -- Job + local job, grade = result.job, tostring(result.job_grade) + if not ESX.DoesJobExist(job, grade) then - job, grade, duty = "unemployed", "0", false print( ("[^3WARNING^7] Ignoring invalid job for ^5%s^7 [job: ^5%s^7, grade: ^5%s^7]"):format( identifier, @@ -187,46 +192,34 @@ function loadESXPlayer(identifier, playerId, isNew) grade ) ) + job, grade = "unemployed", "0" end - local jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade] - - userData.job.id = jobObject.id - userData.job.name = jobObject.name - userData.job.label = jobObject.label - userData.job.type = jobObject.type - userData.job.duty = type(duty) == "boolean" and duty or jobObject.default_duty --[[@as boolean]] - userData.job.grade = tonumber(grade) - userData.job.grade_name = gradeObject.name - userData.job.grade_label = gradeObject.label - userData.job.grade_salary = gradeObject.salary - userData.job.grade_offduty_salary = gradeObject.offduty_salary - userData.job.skin_male = gradeObject.skin_male and json.decode(gradeObject.skin_male) or {} --[[@diagnostic disable-line: param-type-mismatch]] - userData.job.skin_female = gradeObject.skin_female and json.decode(gradeObject.skin_female) or {} --[[@diagnostic disable-line: param-type-mismatch]] + jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade] - -- Inventory - if not Config.OxInventory then - if result.inventory and result.inventory ~= "" then - local inventory = json.decode(result.inventory) + userData.job = { + id = jobObject.id, + name = jobObject.name, + label = jobObject.label, - for name, count in pairs(inventory) do - local item = ESX.Items[name] + grade = tonumber(grade), + grade_name = gradeObject.name, + grade_label = gradeObject.label, + grade_salary = gradeObject.salary, - if item then - foundItems[name] = count - else - print(('[^3WARNING^7] Ignoring invalid item ^5"%s"^7 for ^5"%s^7"'):format(name, identifier)) - end - end - end + skin_male = gradeObject.skin_male and json.decode(gradeObject.skin_male) or {}, + skin_female = gradeObject.skin_female and json.decode(gradeObject.skin_female) or {}, + } + + -- Inventory + if not Config.OxInventory then + local inventory = (result.inventory and result.inventory ~= "") and json.decode(result.inventory) or {} for name, item in pairs(ESX.Items) do - local count = foundItems[name] or 0 - if count > 0 then - userData.weight = userData.weight + (item.weight * count) - end + local count = inventory[name] or 0 + userData.weight += (count * item.weight) - table.insert(userData.inventory, { + userData.inventory[#userData.inventory + 1] = { name = name, count = count, label = item.label, @@ -234,18 +227,13 @@ function loadESXPlayer(identifier, playerId, isNew) usable = Core.UsableItemsCallbacks[name] ~= nil, rare = item.rare, canRemove = item.canRemove, - }) + } end - table.sort(userData.inventory, function(a, b) return a.label < b.label end) - else - if result.inventory and result.inventory ~= "" then - userData.inventory = json.decode(result.inventory) - else - userData.inventory = {} - end + elseif result.inventory and result.inventory ~= "" then + userData.inventory = json.decode(result.inventory) end -- Group @@ -269,62 +257,29 @@ function loadESXPlayer(identifier, playerId, isNew) local label = ESX.GetWeaponLabel(name) if label then - if not weapon.components then - weapon.components = {} - end - if not weapon.tintIndex then - weapon.tintIndex = 0 - end - - table.insert(userData.loadout, { + userData.loadout[#userData.loadout + 1] = { name = name, ammo = weapon.ammo, label = label, - components = weapon.components, - tintIndex = weapon.tintIndex, - }) + components = weapon.components or {}, + tintIndex = weapon.tintIndex or 0, + } end end end end -- Position - if result.position and result.position ~= "" then - userData.coords = json.decode(result.position) - else - print( - '[^3WARNING^7] Column ^5"position"^0 in ^5"users"^0 table is missing required default value. Using backup coords, fix your database.' - ) - userData.coords = { x = -269.4, y = -955.3, z = 31.2, heading = 205.8 } - end + userData.coords = json.decode(result.position) or Config.DefaultSpawns[math.random(#Config.DefaultSpawns)] -- Skin - if result.skin and result.skin ~= "" then - userData.skin = json.decode(result.skin) - else - if userData.sex == "f" then - userData.skin = { sex = 1 } - else - userData.skin = { sex = 0 } - end - end + userData.skin = (result.skin and result.skin ~= "") and json.decode(result.skin) + or { sex = userData.sex == "f" and 1 or 0 } - -- Identity - if result.firstname and result.firstname ~= "" then - userData.firstname = result.firstname - userData.lastname = result.lastname - userData.playerName = userData.firstname .. " " .. userData.lastname - if result.dateofbirth then - userData.dateofbirth = result.dateofbirth - end - if result.sex then - userData.sex = result.sex - end - if result.height then - userData.height = result.height - end - end + -- Metadata + userData.metadata = (result.metadata and result.metadata ~= "") and json.decode(result.metadata) or {} + -- xPlayer Creation local xPlayer = CreateExtendedPlayer( playerId, identifier, @@ -334,44 +289,56 @@ function loadESXPlayer(identifier, playerId, isNew) userData.weight, userData.job, userData.loadout, - userData.playerName, - userData.coords + GetPlayerName(playerId), + userData.coords, + userData.metadata ) ESX.Players[playerId] = xPlayer + Core.playersByIdentifier[identifier] = xPlayer - if userData.firstname then - xPlayer.set("firstName", userData.firstname) - xPlayer.set("lastName", userData.lastname) - if userData.dateofbirth then - xPlayer.set("dateofbirth", userData.dateofbirth) + -- Identity + if result.firstname and result.firstname ~= "" then + userData.firstName = result.firstname + userData.lastName = result.lastname + + xPlayer.set("firstName", result.firstname) + xPlayer.set("lastName", result.lastname) + xPlayer.setName(("%s %s"):format(result.firstname, result.lastname)) + + if result.dateofbirth then + userData.dateofbirth = result.dateofbirth + xPlayer.set("dateofbirth", result.dateofbirth) end - if userData.sex then - xPlayer.set("sex", userData.sex) + if result.sex then + userData.sex = result.sex + xPlayer.set("sex", result.sex) end - if userData.height then - xPlayer.set("height", userData.height) + if result.height then + userData.height = result.height + xPlayer.set("height", result.height) end end TriggerEvent("esx:playerLoaded", playerId, xPlayer, isNew) - - xPlayer.triggerEvent("esx:playerLoaded", { - accounts = xPlayer.getAccounts(), - coords = userData.coords, - identifier = xPlayer.getIdentifier(), - inventory = xPlayer.getInventory(), - job = xPlayer.getJob(), - loadout = xPlayer.getLoadout(), - maxWeight = xPlayer.getMaxWeight(), - money = xPlayer.getMoney(), - sex = xPlayer.get("sex") or "m", - dead = false, - }, isNew, userData.skin) + userData.money = xPlayer.getMoney() + userData.maxWeight = xPlayer.getMaxWeight() + xPlayer.triggerEvent("esx:playerLoaded", userData, isNew, userData.skin) if not Config.OxInventory then xPlayer.triggerEvent("esx:createMissingPickups", Core.Pickups) else exports.ox_inventory:setPlayerInventory(xPlayer, userData.inventory) + if isNew then + local shared = json.decode(GetConvar("inventory:accounts", '["money"]')) + + for i = 1, #shared do + local name = shared[i] + local account = Config.StartingAccountMoney[name] + if account then + exports.ox_inventory:AddItem(playerId, name, account) + end + end + end end xPlayer.triggerEvent("esx:registerSuggestions", Core.RegisteredCommands) print(('[^2INFO^0] Player ^5"%s"^0 has connected to the server. ID: ^5%s^7'):format(xPlayer.getName(), playerId)) @@ -382,7 +349,7 @@ AddEventHandler("chatMessage", function(playerId, _, message) if message:sub(1, 1) == "/" and playerId > 0 then CancelEvent() local commandName = message:sub(1):gmatch("%w+")() - xPlayer.showNotification(_U("commanderror_invalidcommand", commandName)) + xPlayer.showNotification(TranslateCap("commanderror_invalidcommand", commandName)) end end) @@ -392,18 +359,43 @@ AddEventHandler("playerDropped", function(reason) if xPlayer then TriggerEvent("esx:playerDropped", playerId, reason) - + local job = xPlayer.getJob().name + local currentJob = ESX.JobsPlayerCount[job] + ESX.JobsPlayerCount[job] = ((currentJob and currentJob > 0) and currentJob or 1) - 1 + GlobalState[("%s:count"):format(job)] = ESX.JobsPlayerCount[job] + Core.playersByIdentifier[xPlayer.identifier] = nil Core.SavePlayer(xPlayer, function() ESX.Players[playerId] = nil end) end end) +AddEventHandler("esx:playerLoaded", function(_, xPlayer) + local job = xPlayer.getJob().name + local jobKey = ("%s:count"):format(job) + + ESX.JobsPlayerCount[job] = (ESX.JobsPlayerCount[job] or 0) + 1 + GlobalState[jobKey] = ESX.JobsPlayerCount[job] +end) + +AddEventHandler("esx:setJob", function(_, job, lastJob) + local lastJobKey = ("%s:count"):format(lastJob.name) + local jobKey = ("%s:count"):format(job.name) + local currentLastJob = ESX.JobsPlayerCount[lastJob.name] + + ESX.JobsPlayerCount[lastJob.name] = ((currentLastJob and currentLastJob > 0) and currentLastJob or 1) - 1 + ESX.JobsPlayerCount[job.name] = (ESX.JobsPlayerCount[job.name] or 0) + 1 + + GlobalState[lastJobKey] = ESX.JobsPlayerCount[lastJob.name] + GlobalState[jobKey] = ESX.JobsPlayerCount[job.name] +end) + AddEventHandler("esx:playerLogout", function(playerId, cb) local xPlayer = ESX.GetPlayerFromId(playerId) if xPlayer then TriggerEvent("esx:playerDropped", playerId) + Core.playersByIdentifier[xPlayer.identifier] = nil Core.SavePlayer(xPlayer, function() ESX.Players[playerId] = nil if cb then @@ -425,17 +417,17 @@ if not Config.OxInventory then end) RegisterNetEvent("esx:giveInventoryItem") - AddEventHandler("esx:giveInventoryItem", function(target, type, itemName, itemCount) + AddEventHandler("esx:giveInventoryItem", function(target, itemType, itemName, itemCount) local playerId = source local sourceXPlayer = ESX.GetPlayerFromId(playerId) local targetXPlayer = ESX.GetPlayerFromId(target) local distance = #(GetEntityCoords(GetPlayerPed(playerId)) - GetEntityCoords(GetPlayerPed(target))) if not sourceXPlayer or not targetXPlayer or distance > Config.DistanceGive then - print("[^3WARNING^7] Player Detected Cheating: ^5" .. GetPlayerName(playerId) .. "^7") + print(("[^3WARNING^7] Player Detected Cheating: ^5%s^7"):format(GetPlayerName(playerId))) return end - if type == "item_standard" then + if itemType == "item_standard" then local sourceItem = sourceXPlayer.getInventoryItem(itemName) if itemCount > 0 and sourceItem.count >= itemCount then @@ -443,21 +435,25 @@ if not Config.OxInventory then sourceXPlayer.removeInventoryItem(itemName, itemCount) targetXPlayer.addInventoryItem(itemName, itemCount) - sourceXPlayer.showNotification(_U("gave_item", itemCount, sourceItem.label, targetXPlayer.name)) - targetXPlayer.showNotification(_U("received_item", itemCount, sourceItem.label, sourceXPlayer.name)) + sourceXPlayer.showNotification( + TranslateCap("gave_item", itemCount, sourceItem.label, targetXPlayer.name) + ) + targetXPlayer.showNotification( + TranslateCap("received_item", itemCount, sourceItem.label, sourceXPlayer.name) + ) else - sourceXPlayer.showNotification(_U("ex_inv_lim", targetXPlayer.name)) + sourceXPlayer.showNotification(TranslateCap("ex_inv_lim", targetXPlayer.name)) end else - sourceXPlayer.showNotification(_U("imp_invalid_quantity")) + sourceXPlayer.showNotification(TranslateCap("imp_invalid_quantity")) end - elseif type == "item_account" then + elseif itemType == "item_account" then if itemCount > 0 and sourceXPlayer.getAccount(itemName).money >= itemCount then sourceXPlayer.removeAccountMoney(itemName, itemCount, "Gave to " .. targetXPlayer.name) targetXPlayer.addAccountMoney(itemName, itemCount, "Received from " .. sourceXPlayer.name) sourceXPlayer.showNotification( - _U( + TranslateCap( "gave_account_money", ESX.Math.GroupDigits(itemCount), Config.Accounts[itemName].label, @@ -465,7 +461,7 @@ if not Config.OxInventory then ) ) targetXPlayer.showNotification( - _U( + TranslateCap( "received_account_money", ESX.Math.GroupDigits(itemCount), Config.Accounts[itemName].label, @@ -473,9 +469,9 @@ if not Config.OxInventory then ) ) else - sourceXPlayer.showNotification(_U("imp_invalid_amount")) + sourceXPlayer.showNotification(TranslateCap("imp_invalid_amount")) end - elseif type == "item_weapon" then + elseif itemType == "item_weapon" then if sourceXPlayer.hasWeapon(itemName) then local weaponLabel = ESX.GetWeaponLabel(itemName) if not targetXPlayer.hasWeapon(itemName) then @@ -498,21 +494,31 @@ if not Config.OxInventory then if weaponObject.ammo and itemCount > 0 then local ammoLabel = weaponObject.ammo.label sourceXPlayer.showNotification( - _U("gave_weapon_withammo", weaponLabel, itemCount, ammoLabel, targetXPlayer.name) + TranslateCap("gave_weapon_withammo", weaponLabel, itemCount, ammoLabel, targetXPlayer.name) ) targetXPlayer.showNotification( - _U("received_weapon_withammo", weaponLabel, itemCount, ammoLabel, sourceXPlayer.name) + TranslateCap( + "received_weapon_withammo", + weaponLabel, + itemCount, + ammoLabel, + sourceXPlayer.name + ) ) else - sourceXPlayer.showNotification(_U("gave_weapon", weaponLabel, targetXPlayer.name)) - targetXPlayer.showNotification(_U("received_weapon", weaponLabel, sourceXPlayer.name)) + sourceXPlayer.showNotification(TranslateCap("gave_weapon", weaponLabel, targetXPlayer.name)) + targetXPlayer.showNotification(TranslateCap("received_weapon", weaponLabel, sourceXPlayer.name)) end else - sourceXPlayer.showNotification(_U("gave_weapon_hasalready", targetXPlayer.name, weaponLabel)) - targetXPlayer.showNotification(_U("received_weapon_hasalready", sourceXPlayer.name, weaponLabel)) + sourceXPlayer.showNotification( + TranslateCap("gave_weapon_hasalready", targetXPlayer.name, weaponLabel) + ) + targetXPlayer.showNotification( + TranslateCap("received_weapon_hasalready", sourceXPlayer.name, weaponLabel) + ) end end - elseif type == "item_ammo" then + elseif itemType == "item_ammo" then if sourceXPlayer.hasWeapon(itemName) then local _, weapon = sourceXPlayer.getWeapon(itemName) @@ -527,85 +533,87 @@ if not Config.OxInventory then targetXPlayer.addWeaponAmmo(itemName, itemCount) sourceXPlayer.showNotification( - _U("gave_weapon_ammo", itemCount, ammoLabel, weapon.label, targetXPlayer.name) + TranslateCap("gave_weapon_ammo", itemCount, ammoLabel, weapon.label, targetXPlayer.name) ) targetXPlayer.showNotification( - _U("received_weapon_ammo", itemCount, ammoLabel, weapon.label, sourceXPlayer.name) + TranslateCap( + "received_weapon_ammo", + itemCount, + ammoLabel, + weapon.label, + sourceXPlayer.name + ) ) end end else - sourceXPlayer.showNotification(_U("gave_weapon_noweapon", targetXPlayer.name)) - targetXPlayer.showNotification(_U("received_weapon_noweapon", sourceXPlayer.name, weapon.label)) + sourceXPlayer.showNotification(TranslateCap("gave_weapon_noweapon", targetXPlayer.name)) + targetXPlayer.showNotification( + TranslateCap("received_weapon_noweapon", sourceXPlayer.name, weapon.label) + ) end end end end) - RegisterServerEvent("esx:removeInventoryItem", function(type, itemName, itemCount) + RegisterNetEvent("esx:removeInventoryItem") + AddEventHandler("esx:removeInventoryItem", function(itemType, itemName, itemCount) local playerId = source local xPlayer = ESX.GetPlayerFromId(playerId) - if type == "item_standard" then + if itemType == "item_standard" then if itemCount == nil or itemCount < 1 then - xPlayer.showNotification(_U("imp_invalid_quantity")) + xPlayer.showNotification(TranslateCap("imp_invalid_quantity")) else local xItem = xPlayer.getInventoryItem(itemName) - if not xItem or itemCount > xItem.count or xItem.count < 1 then - xPlayer.showNotification(_U("imp_invalid_quantity")) + if itemCount > xItem.count or xItem.count < 1 then + xPlayer.showNotification(TranslateCap("imp_invalid_quantity")) else xPlayer.removeInventoryItem(itemName, itemCount) local pickupLabel = ("%s [%s]"):format(xItem.label, itemCount) ESX.CreatePickup("item_standard", itemName, itemCount, pickupLabel, playerId) - xPlayer.showNotification(_U("threw_standard", itemCount, xItem.label)) + xPlayer.showNotification(TranslateCap("threw_standard", itemCount, xItem.label)) end end - elseif type == "item_account" then + elseif itemType == "item_account" then if itemCount == nil or itemCount < 1 then - xPlayer.showNotification(_U("imp_invalid_amount")) + xPlayer.showNotification(TranslateCap("imp_invalid_amount")) else local account = xPlayer.getAccount(itemName) - if not account or itemCount > account.money or account.money < 1 then - xPlayer.showNotification(_U("imp_invalid_amount")) + if itemCount > account.money or account.money < 1 then + xPlayer.showNotification(TranslateCap("imp_invalid_amount")) else xPlayer.removeAccountMoney(itemName, itemCount, "Threw away") local pickupLabel = ("%s [%s]"):format( account.label, - _U("locale_currency", ESX.Math.GroupDigits(itemCount)) + TranslateCap("locale_currency", ESX.Math.GroupDigits(itemCount)) ) ESX.CreatePickup("item_account", itemName, itemCount, pickupLabel, playerId) xPlayer.showNotification( - _U("threw_account", ESX.Math.GroupDigits(itemCount), string.lower(account.label)) + TranslateCap("threw_account", ESX.Math.GroupDigits(itemCount), string.lower(account.label)) ) end end - elseif type == "item_weapon" then + elseif itemType == "item_weapon" then itemName = string.upper(itemName) if xPlayer.hasWeapon(itemName) then local _, weapon = xPlayer.getWeapon(itemName) - - if not weapon then - return - end - local _, weaponObject = ESX.GetWeapon(itemName) - local components = ESX.Table.Clone(weapon.components) - local weaponAmmo = false + local components, pickupLabel = ESX.Table.Clone(weapon.components) xPlayer.removeWeapon(itemName) if weaponObject.ammo and weapon.ammo > 0 then - weaponAmmo = weaponObject.ammo.label - xPlayer.showNotification(_U("threw_weapon_ammo", weapon.label, weapon.ammo, weaponAmmo)) + local ammoLabel = weaponObject.ammo.label + pickupLabel = ("%s [%s %s]"):format(weapon.label, weapon.ammo, ammoLabel) + xPlayer.showNotification(TranslateCap("threw_weapon_ammo", weapon.label, weapon.ammo, ammoLabel)) else - xPlayer.showNotification(_U("threw_weapon", weapon.label)) + pickupLabel = ("%s"):format(weapon.label) + xPlayer.showNotification(TranslateCap("threw_weapon", weapon.label)) end - local pickupLabel = weaponAmmo and ("%s [%s %s]"):format(weapon.label, weapon.ammo, weaponAmmo) - or ("%s"):format(weapon.label) - ESX.CreatePickup( "item_weapon", itemName, @@ -628,7 +636,7 @@ if not Config.OxInventory then if count > 0 then ESX.UseItem(source, itemName) else - xPlayer.showNotification(_U("act_imp")) + xPlayer.showNotification(TranslateCap("act_imp")) end end) @@ -637,19 +645,29 @@ if not Config.OxInventory then local pickup, xPlayer, success = Core.Pickups[pickupId], ESX.GetPlayerFromId(source) if pickup then + local playerPickupDistance = #(pickup.coords - xPlayer.getCoords(true)) + if playerPickupDistance > 5.0 then + print( + ("[^3WARNING^7] Player Detected Cheating (Out of range pickup): ^5%s^7"):format( + xPlayer.getIdentifier() + ) + ) + return + end + if pickup.type == "item_standard" then if xPlayer.canCarryItem(pickup.name, pickup.count) then xPlayer.addInventoryItem(pickup.name, pickup.count) success = true else - xPlayer.showNotification(_U("threw_cannot_pickup")) + xPlayer.showNotification(TranslateCap("threw_cannot_pickup")) end elseif pickup.type == "item_account" then success = true xPlayer.addAccountMoney(pickup.name, pickup.count, "Picked up") elseif pickup.type == "item_weapon" then if xPlayer.hasWeapon(pickup.name) then - xPlayer.showNotification(_U("threw_weapon_already")) + xPlayer.showNotification(TranslateCap("threw_weapon_already")) else success = true xPlayer.addWeapon(pickup.name, pickup.count) @@ -680,6 +698,7 @@ ESX.RegisterServerCallback("esx:getPlayerData", function(source, cb) loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true), + metadata = xPlayer.getMeta(), }) end) @@ -687,6 +706,10 @@ ESX.RegisterServerCallback("esx:isUserAdmin", function(source, cb) cb(Core.IsPlayerAdmin(source)) end) +ESX.RegisterServerCallback("esx:getGameBuild", function(_, cb) + cb(tonumber(GetConvar("sv_enforceGameBuild", 1604))) +end) + ESX.RegisterServerCallback("esx:getOtherPlayerData", function(_, cb, target) local xPlayer = ESX.GetPlayerFromId(target) @@ -698,14 +721,14 @@ ESX.RegisterServerCallback("esx:getOtherPlayerData", function(_, cb, target) loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true), - metadata = xPlayer.getMetadata(), + metadata = xPlayer.getMeta(), }) end) ESX.RegisterServerCallback("esx:getPlayerNames", function(source, cb, players) players[source] = nil - for playerId in pairs(players) do + for playerId, _ in pairs(players) do local xPlayer = ESX.GetPlayerFromId(playerId) if xPlayer then @@ -718,6 +741,28 @@ ESX.RegisterServerCallback("esx:getPlayerNames", function(source, cb, players) cb(players) end) +ESX.RegisterServerCallback("esx:spawnVehicle", function(source, cb, vehData) + local ped = GetPlayerPed(source) + ESX.OneSync.SpawnVehicle( + vehData.model or `ADDER`, + vehData.coords or GetEntityCoords(ped), + vehData.coords.w or 0.0, + vehData.props or {}, + function(id) + if vehData.warp then + local vehicle = NetworkGetEntityFromNetworkId(id) + local timeout = 0 + while GetVehiclePedIsIn(ped) ~= vehicle and timeout <= 15 do + Wait(0) + TaskWarpPedIntoVehicle(ped, vehicle, -1) + timeout += 1 + end + end + cb(id) + end + ) +end) + AddEventHandler("txAdmin:events:scheduledRestart", function(eventData) if eventData.secondsRemaining == 60 then CreateThread(function() @@ -730,3 +775,32 @@ end) AddEventHandler("txAdmin:events:serverShuttingDown", function() Core.SavePlayers() end) + +local DoNotUse = { + ["essentialmode"] = true, + ["es_admin2"] = true, + ["basic-gamemode"] = true, + ["mapmanager"] = true, + ["fivem-map-skater"] = true, + ["fivem-map-hipster"] = true, + ["qb-core"] = true, + ["default_spawnpoint"] = true, +} + +AddEventHandler("onResourceStart", function(key) + if DoNotUse[string.lower(key)] then + while GetResourceState(key) ~= "started" do + Wait(0) + end + + StopResource(key) + print(("[^1ERROR^7] WE STOPPED A RESOURCE THAT WILL BREAK ^1ESX^7, PLEASE REMOVE ^5%s^7"):format(key)) + end +end) + +for key in pairs(DoNotUse) do + if GetResourceState(key) == "started" or GetResourceState(key) == "starting" then + StopResource(key) + print(("[^1ERROR^7] WE STOPPED A RESOURCE THAT WILL BREAK ^1ESX^7, PLEASE REMOVE ^5%s^7"):format(key)) + end +end diff --git a/server-data/resources/[esx]/es_extended/server/onesync.lua b/server-data/resources/[esx]/es_extended/server/onesync.lua index 4c56c9e43..737918c1d 100644 --- a/server-data/resources/[esx]/es_extended/server/onesync.lua +++ b/server-data/resources/[esx]/es_extended/server/onesync.lua @@ -1,24 +1,42 @@ ESX.OneSync = {} ----@class vector3 ----@field x number ----@field y number ----@field z number - +---@param source number|vector3 +---@param closest boolean +---@param distance? number +---@param ignore? table local function getNearbyPlayers(source, closest, distance, ignore) local result = {} local count = 0 + local playerPed + local playerCoords + if not distance then distance = 100 end + if type(source) == "number" then - source = GetPlayerPed(source) + playerPed = GetPlayerPed(source) if not source then - error("Received invalid first argument (source); should be playerId or vector3 coordinates") + error("Received invalid first argument (source); should be playerId") + return result end - source = GetEntityCoords(GetPlayerPed(source)) + playerCoords = GetEntityCoords(playerPed) + + if not playerCoords then + error("Received nil value (playerCoords); perhaps source is nil at first place?") + return result + end + end + + if type(source) == "vector3" then + playerCoords = source + + if not playerCoords then + error("Received nil value (playerCoords); perhaps source is nil at first place?") + return result + end end for _, xPlayer in pairs(ESX.Players) do @@ -27,9 +45,9 @@ local function getNearbyPlayers(source, closest, distance, ignore) local coords = GetEntityCoords(entity) if not closest then - local dist = #(source - coords) + local dist = #(playerCoords - coords) if dist <= distance then - count += 1 + count = count + 1 result[count] = { id = xPlayer.source, ped = NetworkGetNetworkIdFromEntity(entity), @@ -38,14 +56,16 @@ local function getNearbyPlayers(source, closest, distance, ignore) } end else - local dist = #(source - coords) - if dist <= (result.dist or distance) then - result = { - id = xPlayer.source, - ped = NetworkGetNetworkIdFromEntity(entity), - coords = coords, - dist = dist, - } + if xPlayer.source ~= source then + local dist = #(playerCoords - coords) + if dist <= (result.dist or distance) then + result = { + id = xPlayer.source, + ped = NetworkGetNetworkIdFromEntity(entity), + coords = coords, + dist = dist, + } + end end end end @@ -56,14 +76,14 @@ end ---@param source vector3|number playerId or vector3 coordinates ---@param maxDistance number ----@param ignore table playerIds to ignore, where the key is playerId and value is true +---@param ignore? table playerIds to ignore, where the key is playerId and value is true function ESX.OneSync.GetPlayersInArea(source, maxDistance, ignore) return getNearbyPlayers(source, false, maxDistance, ignore) end ---@param source vector3|number playerId or vector3 coordinates ---@param maxDistance number ----@param ignore table playerIds to ignore, where the key is playerId and value is true +---@param ignore? table playerIds to ignore, where the key is playerId and value is true function ESX.OneSync.GetClosestPlayer(source, maxDistance, ignore) return getNearbyPlayers(source, true, maxDistance, ignore) end @@ -71,25 +91,24 @@ end ---@param model number|string ---@param coords vector3|table ---@param heading number ----@param Properties table +---@param properties table ---@param cb function -function ESX.OneSync.SpawnVehicle(model, coords, heading, Properties, cb) - local veh_model = type(model) == "string" and joaat(model) or model - Properties = Properties or {} - local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z) - TriggerClientEvent("esx:requestModel", -1, model) +function ESX.OneSync.SpawnVehicle(model, coords, heading, properties, cb) + local vehicleModel = joaat(model) + local vehicleProperties = properties + CreateThread(function() - local xPlayer = ESX.OneSync.GetClosestPlayer(vector, 300) - ESX.GetVehicleType(veh_model, xPlayer.id, function(Type) - if Type then - local SpawnedEntity = CreateVehicleServerSetter(veh_model, Type, vector, heading) - local NetworkId = NetworkGetNetworkIdFromEntity(SpawnedEntity) - while not DoesEntityExist(SpawnedEntity) do - Wait(100) + local xPlayer = ESX.OneSync.GetClosestPlayer(coords, 300) + ESX.GetVehicleType(vehicleModel, xPlayer.id, function(vehicleType) + if vehicleType then + local createdVehicle = CreateVehicleServerSetter(vehicleModel, vehicleType, coords, heading) + if not DoesEntityExist(createdVehicle) then + return print("[^1ERROR^7] Unfortunately, this vehicle has not spawned") end - Properties.NetId = NetworkId - Entity(SpawnedEntity).state:set("VehicleProperties", Properties, true) - cb(NetworkId) + + local networkId = NetworkGetNetworkIdFromEntity(createdVehicle) + Entity(createdVehicle).state:set("VehicleProperties", vehicleProperties, true) + cb(networkId) else print(("[^1ERROR^7] Tried to spawn invalid vehicle - ^5%s^7!"):format(model)) end @@ -105,9 +124,9 @@ function ESX.OneSync.SpawnObject(model, coords, heading, cb) if type(model) == "string" then model = joaat(model) end - coords = type(coords) == "vector3" and coords or vector3(coords.x, coords.y, coords.z) + local objectCoords = type(coords) == "vector3" and coords or vector3(coords.x, coords.y, coords.z) CreateThread(function() - local entity = CreateObject(model, coords.x, coords.y, coords.z, true, true, false) + local entity = CreateObject(model, objectCoords, true, true) while not DoesEntityExist(entity) do Wait(50) end @@ -229,7 +248,3 @@ end function ESX.OneSync.GetClosestVehicle(coords, modelFilter) return getClosestEntity(GetAllVehicles(), coords, modelFilter) end - -ESX.RegisterServerCallback("esx:Onesync:SpawnObject", function(_, cb, model, coords, heading) - ESX.OneSync.SpawnObject(model, coords, heading, cb) -end) diff --git a/server-data/resources/[esx]/es_extended/server/paycheck.lua b/server-data/resources/[esx]/es_extended/server/paycheck.lua index 162fe2858..47bb68110 100644 --- a/server-data/resources/[esx]/es_extended/server/paycheck.lua +++ b/server-data/resources/[esx]/es_extended/server/paycheck.lua @@ -3,20 +3,29 @@ function StartPayCheck() while true do Wait(Config.PaycheckInterval) for player, xPlayer in pairs(ESX.Players) do + local jobLabel = xPlayer.job.label local job = xPlayer.job.grade_name local salary = xPlayer.job.grade_salary + if salary > 0 then if job == "unemployed" then -- unemployed xPlayer.addAccountMoney("bank", salary, "Welfare Check") TriggerClientEvent( "esx:showAdvancedNotification", player, - _U("bank"), - _U("received_paycheck"), - _U("received_help", salary), + TranslateCap("bank"), + TranslateCap("received_paycheck"), + TranslateCap("received_help", salary), "CHAR_BANK_MAZE", 9 ) + if Config.LogPaycheck then + ESX.DiscordLogFields("Paycheck", "Paycheck - Unemployment Benefits", "green", { + { name = "Player", value = xPlayer.name, inline = true }, + { name = "ID", value = xPlayer.source, inline = true }, + { name = "Amount", value = salary, inline = true }, + }) + end elseif Config.EnableSocietyPayouts then -- possibly a society TriggerEvent("esx_society:getSociety", xPlayer.job.name, function(society) if society ~= nil then -- verified society @@ -24,12 +33,20 @@ function StartPayCheck() if account.money >= salary then -- does the society money to pay its employees? xPlayer.addAccountMoney("bank", salary, "Paycheck") account.removeMoney(salary) + if Config.LogPaycheck then + ESX.DiscordLogFields("Paycheck", "Paycheck - " .. jobLabel, "green", { + { name = "Player", value = xPlayer.name, inline = true }, + { name = "ID", value = xPlayer.source, inline = true }, + { name = "Amount", value = salary, inline = true }, + }) + end + TriggerClientEvent( "esx:showAdvancedNotification", player, - _U("bank"), - _U("received_paycheck"), - _U("received_salary", salary), + TranslateCap("bank"), + TranslateCap("received_paycheck"), + TranslateCap("received_salary", salary), "CHAR_BANK_MAZE", 9 ) @@ -37,9 +54,9 @@ function StartPayCheck() TriggerClientEvent( "esx:showAdvancedNotification", player, - _U("bank"), + TranslateCap("bank"), "", - _U("company_nomoney"), + TranslateCap("company_nomoney"), "CHAR_BANK_MAZE", 1 ) @@ -47,12 +64,19 @@ function StartPayCheck() end) else -- not a society xPlayer.addAccountMoney("bank", salary, "Paycheck") + if Config.LogPaycheck then + ESX.DiscordLogFields("Paycheck", "Paycheck - " .. jobLabel, "green", { + { name = "Player", value = xPlayer.name, inline = true }, + { name = "ID", value = xPlayer.source, inline = true }, + { name = "Amount", value = salary, inline = true }, + }) + end TriggerClientEvent( "esx:showAdvancedNotification", player, - _U("bank"), - _U("received_paycheck"), - _U("received_salary", salary), + TranslateCap("bank"), + TranslateCap("received_paycheck"), + TranslateCap("received_salary", salary), "CHAR_BANK_MAZE", 9 ) @@ -60,12 +84,19 @@ function StartPayCheck() end) else -- generic job xPlayer.addAccountMoney("bank", salary, "Paycheck") + if Config.LogPaycheck then + ESX.DiscordLogFields("Paycheck", "Paycheck - Generic", "green", { + { name = "Player", value = xPlayer.name, inline = true }, + { name = "ID", value = xPlayer.source, inline = true }, + { name = "Amount", value = salary, inline = true }, + }) + end TriggerClientEvent( "esx:showAdvancedNotification", player, - _U("bank"), - _U("received_paycheck"), - _U("received_salary", salary), + TranslateCap("bank"), + TranslateCap("received_paycheck"), + TranslateCap("received_salary", salary), "CHAR_BANK_MAZE", 9 ) From f4698d6bc43f52129cb1ca2f08af50784d4fad61 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 17:59:57 +0100 Subject: [PATCH 04/18] Merge branch 'dev' of https://github.com/bitpredator/empiretown into dev From 4d8a3b71a1bcd368870cca6fe9b2b287cce620e8 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:08:11 +0100 Subject: [PATCH 05/18] chore: esx_context updated to version 1.0.1 --- server-data/resources/[esx]/esx_context/LICENSE | 2 +- server-data/resources/[esx]/esx_context/README.md | 6 ++---- server-data/resources/[esx]/esx_context/fxmanifest.lua | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/server-data/resources/[esx]/esx_context/LICENSE b/server-data/resources/[esx]/esx_context/LICENSE index 0c389f34d..aa019c8aa 100644 --- a/server-data/resources/[esx]/esx_context/LICENSE +++ b/server-data/resources/[esx]/esx_context/LICENSE @@ -651,7 +651,7 @@ 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: - esx_context Copyright (C) 2015-2024 + esx_context Copyright (C) 2015-2024 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. diff --git a/server-data/resources/[esx]/esx_context/README.md b/server-data/resources/[esx]/esx_context/README.md index c204f0f85..6b119ffd7 100644 --- a/server-data/resources/[esx]/esx_context/README.md +++ b/server-data/resources/[esx]/esx_context/README.md @@ -2,12 +2,10 @@ A elegant, easy to use Context Menu system to make User Interactions clean and h # Legal -esx_context - -Copyright 2015-2024 (C) ESX-Framework +esx_context Copyright 2015-2024 (C) ESX-Framework 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 http://www.gnu.org/licenses/. \ No newline at end of file +You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. diff --git a/server-data/resources/[esx]/esx_context/fxmanifest.lua b/server-data/resources/[esx]/esx_context/fxmanifest.lua index a64e58323..ca884a6f0 100644 --- a/server-data/resources/[esx]/esx_context/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_context/fxmanifest.lua @@ -4,7 +4,7 @@ game("gta5") author("ESX-Framework & Brayden") description("Offical ESX Legacy Context Menu") lua54("yes") -version("1.0.0") +version("1.0.1") ui_page("index.html") From 3e6937589ad8a5279015b12c87f2d5357b3fab5e Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:15:58 +0100 Subject: [PATCH 06/18] chore: esx_identity updated to version 1.0.1 + Run formatter --- .../[esx]/esx_identity/client/main.lua | 2 +- .../resources/[esx]/esx_identity/config.lua | 2 +- .../[esx]/esx_identity/fxmanifest.lua | 2 +- .../[esx]/esx_identity/server/main.lua | 94 +++++++++---------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/server-data/resources/[esx]/esx_identity/client/main.lua b/server-data/resources/[esx]/esx_identity/client/main.lua index 19cc92214..ecd361d50 100644 --- a/server-data/resources/[esx]/esx_identity/client/main.lua +++ b/server-data/resources/[esx]/esx_identity/client/main.lua @@ -65,7 +65,7 @@ if not Config.UseDeferrals then return end - ESX.ShowNotification(_U("thank_you_for_registering")) + ESX.ShowNotification(TranslateCap("thank_you_for_registering")) setGuiState(false) if not ESX.GetConfig().Multichar then diff --git a/server-data/resources/[esx]/esx_identity/config.lua b/server-data/resources/[esx]/esx_identity/config.lua index 98db36960..224e93380 100644 --- a/server-data/resources/[esx]/esx_identity/config.lua +++ b/server-data/resources/[esx]/esx_identity/config.lua @@ -1,5 +1,5 @@ Config = {} -Config.Locale = "en" +Config.Locale = GetConvar("esx:locale", "en") -- [Config.EnableCommands] -- Enables Commands Such As /char and /chardel diff --git a/server-data/resources/[esx]/esx_identity/fxmanifest.lua b/server-data/resources/[esx]/esx_identity/fxmanifest.lua index fed897939..338e39f5f 100644 --- a/server-data/resources/[esx]/esx_identity/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_identity/fxmanifest.lua @@ -3,7 +3,7 @@ fx_version("adamant") game("gta5") description("ESX Identity") lua54("yes") -version("1.0.0") +version("1.0.1") shared_scripts({ "@es_extended/imports.lua", diff --git a/server-data/resources/[esx]/esx_identity/server/main.lua b/server-data/resources/[esx]/esx_identity/server/main.lua index 60d2237ba..5b5689689 100644 --- a/server-data/resources/[esx]/esx_identity/server/main.lua +++ b/server-data/resources/[esx]/esx_identity/server/main.lua @@ -57,15 +57,15 @@ local function checkDOBFormat(str) if ((d <= 0) or (d > 31)) or ((m <= 0) or (m > 12)) or ((y <= Config.LowestYear) or (y > Config.HighestYear)) then return false elseif m == 4 or m == 6 or m == 9 or m == 11 then - return d < 30 + return d <= 30 elseif m == 2 then if y % 400 == 0 or (y % 100 ~= 0 and y % 4 == 0) then - return d < 29 + return d <= 29 else - return d < 28 + return d <= 28 end else - return d < 31 + return d <= 31 end end @@ -166,7 +166,7 @@ if Config.UseDeferrals then or data.sex == "" or data.height == "" then - deferrals.done(_U("data_incorrect")) + deferrals.done(TranslateCap("data_incorrect")) else if checkNameFormat(data.firstname) @@ -186,7 +186,7 @@ if Config.UseDeferrals then deferrals.done() else - deferrals.done(_U("invalid_format")) + deferrals.done(TranslateCap("invalid_format")) end end end @@ -211,22 +211,22 @@ if Config.UseDeferrals then or data.sex == "" or data.height == "" then - return deferrals.done(_U("data_incorrect")) + return deferrals.done(TranslateCap("data_incorrect")) end if not checkNameFormat(data.firstname) then - return deferrals.done(_U("invalid_firstname_format")) + return deferrals.done(TranslateCap("invalid_firstname_format")) end if not checkNameFormat(data.lastname) then - return deferrals.done(_U("invalid_lastname_format")) + return deferrals.done(TranslateCap("invalid_lastname_format")) end if not checkDOBFormat(data.dateofbirth) then - return deferrals.done(_U("invalid_dob_format")) + return deferrals.done(TranslateCap("invalid_dob_format")) end if not checkSexFormat(data.sex) then - return deferrals.done(_U("invalid_sex_format")) + return deferrals.done(TranslateCap("invalid_sex_format")) end if not checkHeightFormat(data.height) then - return deferrals.done(_U("invalid_height_format")) + return deferrals.done(TranslateCap("invalid_height_format")) end playerIdentity[identifier] = { @@ -245,7 +245,7 @@ if Config.UseDeferrals then end ) else - deferrals.done(_U("no_identifier")) + deferrals.done(TranslateCap("no_identifier")) end end) @@ -327,7 +327,7 @@ else Wait(40) if not identifier then - return deferrals.done(_U("no_identifier")) + return deferrals.done(TranslateCap("no_identifier")) end MySQL.single( "SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?", @@ -407,28 +407,28 @@ else ESX.RegisterServerCallback("esx_identity:registerIdentity", function(source, cb, data) local xPlayer = ESX.GetPlayerFromId(source) if not checkNameFormat(data.firstname) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_firstname_format"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_firstname_format"), "error") return cb(false) end if not checkNameFormat(data.lastname) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_lastname_format"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_lastname_format"), "error") return cb(false) end if not checkSexFormat(data.sex) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_sex_format"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_sex_format"), "error") return cb(false) end if not checkDOBFormat(data.dateofbirth) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_dob_format"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_dob_format"), "error") return cb(false) end if not checkHeightFormat(data.height) then - TriggerClientEvent("esx:showNotification", source, _U("invalid_height_format"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_height_format"), "error") return cb(false) end if xPlayer then if alreadyRegistered[xPlayer.identifier] then - xPlayer.showNotification(_U("already_registered"), "error") + xPlayer.showNotification(TranslateCap("already_registered"), "error") return cb(false) end @@ -456,7 +456,7 @@ else end if not multichar then - TriggerClientEvent("esx:showNotification", source, _U("data_incorrect"), "error") + TriggerClientEvent("esx:showNotification", source, TranslateCap("data_incorrect"), "error") return cb(false) end @@ -484,80 +484,80 @@ end if Config.EnableCommands then ESX.RegisterCommand("char", "user", function(xPlayer) if xPlayer and xPlayer.getName() then - xPlayer.showNotification(_U("active_character", xPlayer.getName())) + xPlayer.showNotification(TranslateCap("active_character", xPlayer.getName())) else - xPlayer.showNotification(_U("error_active_character")) + xPlayer.showNotification(TranslateCap("error_active_character")) end - end, false, { help = _U("show_active_character") }) + end, false, { help = TranslateCap("show_active_character") }) ESX.RegisterCommand("chardel", "user", function(xPlayer) if xPlayer and xPlayer.getName() then if Config.UseDeferrals then - xPlayer.kick(_U("deleted_identity")) + xPlayer.kick(TranslateCap("deleted_identity")) Wait(1500) deleteIdentity(xPlayer) - xPlayer.showNotification(_U("deleted_character")) + xPlayer.showNotification(TranslateCap("deleted_character")) playerIdentity[xPlayer.identifier] = nil alreadyRegistered[xPlayer.identifier] = false else deleteIdentity(xPlayer) - xPlayer.showNotification(_U("deleted_character")) + xPlayer.showNotification(TranslateCap("deleted_character")) playerIdentity[xPlayer.identifier] = nil alreadyRegistered[xPlayer.identifier] = false TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.source) end else - xPlayer.showNotification(_U("error_delete_character")) + xPlayer.showNotification(TranslateCap("error_delete_character")) end - end, false, { help = _U("delete_character") }) + end, false, { help = TranslateCap("delete_character") }) end if Config.EnableDebugging then ESX.RegisterCommand("xPlayerGetFirstName", "user", function(xPlayer) if xPlayer and xPlayer.get("firstName") then - xPlayer.showNotification(_U("return_debug_xPlayer_get_first_name", xPlayer.get("firstName"))) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_first_name", xPlayer.get("firstName"))) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_first_name")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_first_name")) end - end, false, { help = _U("debug_xPlayer_get_first_name") }) + end, false, { help = TranslateCap("debug_xPlayer_get_first_name") }) ESX.RegisterCommand("xPlayerGetLastName", "user", function(xPlayer) if xPlayer and xPlayer.get("lastName") then - xPlayer.showNotification(_U("return_debug_xPlayer_get_last_name", xPlayer.get("lastName"))) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_last_name", xPlayer.get("lastName"))) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_last_name")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_last_name")) end - end, false, { help = _U("debug_xPlayer_get_last_name") }) + end, false, { help = TranslateCap("debug_xPlayer_get_last_name") }) ESX.RegisterCommand("xPlayerGetFullName", "user", function(xPlayer) if xPlayer and xPlayer.getName() then - xPlayer.showNotification(_U("return_debug_xPlayer_get_full_name", xPlayer.getName())) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_full_name", xPlayer.getName())) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_full_name")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_full_name")) end - end, false, { help = _U("debug_xPlayer_get_full_name") }) + end, false, { help = TranslateCap("debug_xPlayer_get_full_name") }) ESX.RegisterCommand("xPlayerGetSex", "user", function(xPlayer) if xPlayer and xPlayer.get("sex") then - xPlayer.showNotification(_U("return_debug_xPlayer_get_sex", xPlayer.get("sex"))) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_sex", xPlayer.get("sex"))) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_sex")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_sex")) end - end, false, { help = _U("debug_xPlayer_get_sex") }) + end, false, { help = TranslateCap("debug_xPlayer_get_sex") }) ESX.RegisterCommand("xPlayerGetDOB", "user", function(xPlayer) if xPlayer and xPlayer.get("dateofbirth") then - xPlayer.showNotification(_U("return_debug_xPlayer_get_dob", xPlayer.get("dateofbirth"))) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_dob", xPlayer.get("dateofbirth"))) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_dob")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_dob")) end - end, false, { help = _U("debug_xPlayer_get_dob") }) + end, false, { help = TranslateCap("debug_xPlayer_get_dob") }) ESX.RegisterCommand("xPlayerGetHeight", "user", function(xPlayer) if xPlayer and xPlayer.get("height") then - xPlayer.showNotification(_U("return_debug_xPlayer_get_height", xPlayer.get("height"))) + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_height", xPlayer.get("height"))) else - xPlayer.showNotification(_U("error_debug_xPlayer_get_height")) + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_height")) end - end, false, { help = _U("debug_xPlayer_get_height") }) + end, false, { help = TranslateCap("debug_xPlayer_get_height") }) end From 10505bab98bcf84ac008ae4bcd04522acb899623 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:19:48 +0100 Subject: [PATCH 07/18] chore: esx_menu_default updated to version 1.0.1 + Run formatter --- .../[esx]/esx_menu_default/README.md | 7 + .../[esx]/esx_menu_default/fxmanifest.lua | 5 +- .../[esx]/esx_menu_default/html/css/app.css | 116 ++-- .../[esx]/esx_menu_default/html/js/app.js | 646 +++++++++--------- .../esx_menu_default/html/js/mustache.min.js | 2 +- 5 files changed, 393 insertions(+), 383 deletions(-) diff --git a/server-data/resources/[esx]/esx_menu_default/README.md b/server-data/resources/[esx]/esx_menu_default/README.md index 368f65bb0..9255ac410 100644 --- a/server-data/resources/[esx]/esx_menu_default/README.md +++ b/server-data/resources/[esx]/esx_menu_default/README.md @@ -1,3 +1,10 @@ +

Discord - Website - Documentation + +A defualt List type menu for ESX. + +![Preview_1](https://cdn.discordapp.com/attachments/944789399852417096/997882867336101948/Screenshot_52.png) +![Preview_2](https://cdn.discordapp.com/attachments/944789399852417096/997882867688411176/Screenshot_53.png) + ## Legal esx_menu_defualt - Default Menu! diff --git a/server-data/resources/[esx]/esx_menu_default/fxmanifest.lua b/server-data/resources/[esx]/esx_menu_default/fxmanifest.lua index 9cea64063..41c648425 100644 --- a/server-data/resources/[esx]/esx_menu_default/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_menu_default/fxmanifest.lua @@ -1,10 +1,9 @@ fx_version("adamant") game("gta5") - -description("Menu Default") +description("ESX Menu Default") lua54("yes") -version("1.0.0") +version("1.0.1") client_scripts({ "@es_extended/imports.lua", "client/main.lua" }) diff --git a/server-data/resources/[esx]/esx_menu_default/html/css/app.css b/server-data/resources/[esx]/esx_menu_default/html/css/app.css index 353c701eb..38c7a20d6 100644 --- a/server-data/resources/[esx]/esx_menu_default/html/css/app.css +++ b/server-data/resources/[esx]/esx_menu_default/html/css/app.css @@ -1,110 +1,110 @@ @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@500;600&display=swap"); ::-webkit-scrollbar { - display: none; + display: none; } .menu { - font-family: "Poppins", sans-serif; - min-width: 350px; - color: #fff; - position: absolute; - background: rgba(33, 33, 33, 0); - text-align: center; + font-family: "Poppins", sans-serif; + min-width: 350px; + color: #fff; + position: absolute; + background: rgba(33, 33, 33, 0); + text-align: center; } .head { - display: block; - overflow: hidden; - padding-bottom: 3px; - text-align: center; - margin-bottom: 5px; - white-space: nowrap; - background: rgba(10, 10, 10, 0.9); + display: block; + overflow: hidden; + padding-bottom: 3px; + text-align: center; + margin-bottom: 5px; + white-space: nowrap; + background: rgba(10, 10, 10, 0.9); } .menu .head { - text-align: center; - height: 28px; - color: #ffffff; - font-weight: 700; - font-size: 20px; + text-align: center; + height: 28px; + color: #ffffff; + font-weight: 700; + font-size: 20px; } .menu .menu-items { - max-height: 450px; - overflow-y: auto; - font-weight: 550; + max-height: 450px; + overflow-y: auto; + font-weight: 550; } .menu-items { - margin-bottom: 2px; + margin-bottom: 2px; } .menu .menu-items .menu-item { - display: block; - padding: 7px; - font-size: 13px; - height: 16px; - text-indent: 5px; - margin-top: 5px; - background: rgba(40, 40, 40, 0.8); - color: rgb(202, 202, 202); - border-radius: 5px; - margin-bottom: 6px; + display: block; + padding: 7px; + font-size: 13px; + height: 16px; + text-indent: 5px; + margin-top: 5px; + background: rgba(40, 40, 40, 0.8); + color: rgb(202, 202, 202); + border-radius: 5px; + margin-bottom: 6px; } .menu .menu-items .menu-item.selected { - border: 1px solid rgba(55, 55, 55, 0.9); - background: rgba(20, 20, 20, 0.9); - color: rgba(243, 243, 243); - letter-spacing: 0.2px; - font-weight: 500; + border: 1px solid rgba(55, 55, 55, 0.9); + background: rgba(20, 20, 20, 0.9); + color: rgba(243, 243, 243); + letter-spacing: 0.2px; + font-weight: 500; } .menu.align-left { - left: 0; - top: 50%; + left: 0; + top: 50%; } .menu.align-top-left { - left: 3rem; - top: 0; + left: 3rem; + top: 0; } .menu.align-top { - left: 50%; - top: 0; + left: 50%; + top: 0; } .menu.align-top-right { - right: 3rem; - top: 0; + right: 3rem; + top: 0; } .menu.align-right { - right: 0; - top: 50%; + right: 0; + top: 50%; } .menu.align-bottom-right { - right: 3rem; - bottom: 0; + right: 3rem; + bottom: 0; } .menu.align-bottom { - left: 50%; - bottom: 0; - transform: translate(0, -50%); + left: 50%; + bottom: 0; + transform: translate(0, -50%); } .menu.align-bottom-left { - left: 3rem; - bottom: 0; + left: 3rem; + bottom: 0; } .menu.align-center { - left: 50%; - top: 35%; - transform: translate(-50%, 50%); + left: 50%; + top: 35%; + transform: translate(-50%, 50%); } \ No newline at end of file diff --git a/server-data/resources/[esx]/esx_menu_default/html/js/app.js b/server-data/resources/[esx]/esx_menu_default/html/js/app.js index 33c888bc0..36b960d1b 100644 --- a/server-data/resources/[esx]/esx_menu_default/html/js/app.js +++ b/server-data/resources/[esx]/esx_menu_default/html/js/app.js @@ -1,362 +1,366 @@ (function () { - let MenuTpl = - '

" + - ""; - window.ESX_MENU = {}; - ESX_MENU.ResourceName = "esx_menu_default"; - ESX_MENU.opened = {}; - ESX_MENU.focus = []; - ESX_MENU.pos = {}; - - ESX_MENU.open = function (namespace, name, data) { - if (typeof ESX_MENU.opened[namespace] === "undefined") { - ESX_MENU.opened[namespace] = {}; - } - - if (typeof ESX_MENU.opened[namespace][name] != "undefined") { - ESX_MENU.close(namespace, name); - } - - if (typeof ESX_MENU.pos[namespace] === "undefined") { - ESX_MENU.pos[namespace] = {}; - } - - for (let i = 0; i < data.elements.length; i++) { - if (typeof data.elements[i].type === "undefined") { - data.elements[i].type = "default"; - } - } - - data._index = ESX_MENU.focus.length; - data._namespace = namespace; - data._name = name; - - for (let i = 0; i < data.elements.length; i++) { - data.elements[i]._namespace = namespace; - data.elements[i]._name = name; - } - - ESX_MENU.opened[namespace][name] = data; - ESX_MENU.pos[namespace][name] = 0; - - for (let i = 0; i < data.elements.length; i++) { - if (data.elements[i].selected) { - ESX_MENU.pos[namespace][name] = i; - } else { - data.elements[i].selected = false; - } - } - - ESX_MENU.focus.push({ - namespace: namespace, - name: name, - }); - - ESX_MENU.render(); - $("#menu_" + namespace + "_" + name) - .find(".menu-item.selected")[0] - .scrollIntoView(); - }; - - ESX_MENU.close = function (namespace, name) { - delete ESX_MENU.opened[namespace][name]; - - for (let i = 0; i < ESX_MENU.focus.length; i++) { - if (ESX_MENU.focus[i].namespace === namespace && ESX_MENU.focus[i].name === name) { - ESX_MENU.focus.splice(i, 1); - break; - } - } - - ESX_MENU.render(); - }; - - ESX_MENU.render = function () { - let menuContainer = document.getElementById("menus"); - let focused = ESX_MENU.getFocused(); - menuContainer.innerHTML = ""; - $(menuContainer).hide(); - - for (let namespace in ESX_MENU.opened) { - for (let name in ESX_MENU.opened[namespace]) { - let menuData = ESX_MENU.opened[namespace][name]; - let view = JSON.parse(JSON.stringify(menuData)); - - for (let i = 0; i < menuData.elements.length; i++) { - let element = view.elements[i]; - - switch (element.type) { - case "default": - break; - - case "slider": { - element.isSlider = true; - element.sliderLabel = typeof element.options === "undefined" ? element.value : element.options[element.value]; - - break; - } + let MenuTpl = + '" + + ""; + window.ESX_MENU = {}; + ESX_MENU.ResourceName = "esx_menu_default"; + ESX_MENU.opened = {}; + ESX_MENU.focus = []; + ESX_MENU.pos = {}; + + ESX_MENU.open = function (namespace, name, data) { + if (typeof ESX_MENU.opened[namespace] === "undefined") { + ESX_MENU.opened[namespace] = {}; + } - default: - break; - } + if (typeof ESX_MENU.opened[namespace][name] != "undefined") { + ESX_MENU.close(namespace, name); + } - if (i === ESX_MENU.pos[namespace][name]) { - element.selected = true; - } + if (typeof ESX_MENU.pos[namespace] === "undefined") { + ESX_MENU.pos[namespace] = {}; } - let menu = $(Mustache.render(MenuTpl, view))[0]; - $(menu).hide(); - menuContainer.appendChild(menu); - } - } - - if (typeof focused != "undefined") { - $("#menu_" + focused.namespace + "_" + focused.name).show(); - } - - $(menuContainer).show(); - }; - - ESX_MENU.submit = function (namespace, name, data) { - $.post("http://" + ESX_MENU.ResourceName + "/menu_submit", - JSON.stringify({ - _namespace: namespace, - _name: name, - current: data, - elements: ESX_MENU.opened[namespace][name].elements, - }) - ); - }; - - ESX_MENU.cancel = function (namespace, name) { - $.post("http://" + ESX_MENU.ResourceName + "/menu_cancel", - JSON.stringify({ - _namespace: namespace, - _name: name, - }) - ); - }; - - ESX_MENU.change = function (namespace, name, data) { - $.post("http://" + ESX_MENU.ResourceName + "/menu_change", - JSON.stringify({ - _namespace: namespace, - _name: name, - current: data, - elements: ESX_MENU.opened[namespace][name].elements, - })); - }; - - ESX_MENU.getFocused = function () { - return ESX_MENU.focus[ESX_MENU.focus.length - 1]; - }; - - window.onData = (data) => { - switch (data.action) { - case "openMenu": { - ESX_MENU.open(data.namespace, data.name, data.data); - break; - } - - case "closeMenu": { - ESX_MENU.close(data.namespace, data.name); - break; - } - - case "controlPressed": { - switch (data.control) { - case "ENTER": { - let focused = ESX_MENU.getFocused(); - - if (typeof focused != "undefined") { - let menu = ESX_MENU.opened[focused.namespace][focused.name]; - let pos = ESX_MENU.pos[focused.namespace][focused.name]; - let elem = menu.elements[pos]; - - if (menu.elements.length > 0) { - ESX_MENU.submit(focused.namespace, focused.name, elem); - } + for (let i = 0; i < data.elements.length; i++) { + if (typeof data.elements[i].type === "undefined") { + data.elements[i].type = "default"; } + } - break; - } + data._index = ESX_MENU.focus.length; + data._namespace = namespace; + data._name = name; - case "BACKSPACE": { - let focused = ESX_MENU.getFocused(); + for (let i = 0; i < data.elements.length; i++) { + data.elements[i]._namespace = namespace; + data.elements[i]._name = name; + } - if (typeof focused != "undefined") { - ESX_MENU.cancel(focused.namespace, focused.name); - } + ESX_MENU.opened[namespace][name] = data; + ESX_MENU.pos[namespace][name] = 0; - break; - } + for (let i = 0; i < data.elements.length; i++) { + if (data.elements[i].selected) { + ESX_MENU.pos[namespace][name] = i; + } else { + data.elements[i].selected = false; + } + } - case "TOP": { - let focused = ESX_MENU.getFocused(); + ESX_MENU.focus.push({ + namespace: namespace, + name: name, + }); - if (typeof focused != "undefined") { - let menu = ESX_MENU.opened[focused.namespace][focused.name]; - let pos = ESX_MENU.pos[focused.namespace][focused.name]; + ESX_MENU.render(); + $("#menu_" + namespace + "_" + name) + .find(".menu-item.selected")[0] + .scrollIntoView(); + }; - if (pos > 0) { - ESX_MENU.pos[focused.namespace][focused.name]--; - } else { - ESX_MENU.pos[focused.namespace][focused.name] = menu.elements.length - 1; - } + ESX_MENU.close = function (namespace, name) { + delete ESX_MENU.opened[namespace][name]; - let elem = menu.elements[ESX_MENU.pos[focused.namespace][focused.name]]; + for (let i = 0; i < ESX_MENU.focus.length; i++) { + if (ESX_MENU.focus[i].namespace === namespace && ESX_MENU.focus[i].name === name) { + ESX_MENU.focus.splice(i, 1); + break; + } + } - for (let i = 0; i < menu.elements.length; i++) { - if (i === ESX_MENU.pos[focused.namespace][focused.name]) { - menu.elements[i].selected = true; - } else { - menu.elements[i].selected = false; - } - } + ESX_MENU.render(); + }; - ESX_MENU.change(focused.namespace, focused.name, elem); - ESX_MENU.render(); + ESX_MENU.render = function () { + let menuContainer = document.getElementById("menus"); + let focused = ESX_MENU.getFocused(); + menuContainer.innerHTML = ""; + $(menuContainer).hide(); - $("#menu_" + focused.namespace + "_" + focused.name) - .find(".menu-item.selected")[0] - .scrollIntoView(); - } + for (let namespace in ESX_MENU.opened) { + for (let name in ESX_MENU.opened[namespace]) { + let menuData = ESX_MENU.opened[namespace][name]; + let view = JSON.parse(JSON.stringify(menuData)); - break; - } + for (let i = 0; i < menuData.elements.length; i++) { + let element = view.elements[i]; - case "DOWN": { - let focused = ESX_MENU.getFocused(); + switch (element.type) { + case "default": + break; - if (typeof focused != "undefined") { - let menu = ESX_MENU.opened[focused.namespace][focused.name]; - let pos = ESX_MENU.pos[focused.namespace][focused.name]; - let length = menu.elements.length; + case "slider": { + element.isSlider = true; + element.sliderLabel = typeof element.options === "undefined" ? element.value : element.options[element.value]; - if (pos < length - 1) { - ESX_MENU.pos[focused.namespace][focused.name]++; - } else { - ESX_MENU.pos[focused.namespace][focused.name] = 0; - } + break; + } - let elem = menu.elements[ESX_MENU.pos[focused.namespace][focused.name]]; + default: + break; + } - for (let i = 0; i < menu.elements.length; i++) { - if (i === ESX_MENU.pos[focused.namespace][focused.name]) { - menu.elements[i].selected = true; - } else { - menu.elements[i].selected = false; + if (i === ESX_MENU.pos[namespace][name]) { + element.selected = true; + } } - } - - ESX_MENU.change(focused.namespace, focused.name, elem); - ESX_MENU.render(); - $("#menu_" + focused.namespace + "_" + focused.name) - .find(".menu-item.selected")[0] - .scrollIntoView(); + let menu = $(Mustache.render(MenuTpl, view))[0]; + $(menu).hide(); + menuContainer.appendChild(menu); } + } - break; - } - - case "LEFT": { - let focused = ESX_MENU.getFocused(); - - if (typeof focused != "undefined") { - let menu = ESX_MENU.opened[focused.namespace][focused.name]; - let pos = ESX_MENU.pos[focused.namespace][focused.name]; - let elem = menu.elements[pos]; - - switch (elem.type) { - case "default": - break; - - case "slider": { - let min = typeof elem.min === "undefined" ? 0 : elem.min; - - if (elem.value > min) { - elem.value--; - ESX_MENU.change(focused.namespace, focused.name, elem); - } - - ESX_MENU.render(); - break; - } + if (typeof focused != "undefined") { + $("#menu_" + focused.namespace + "_" + focused.name).show(); + } - default: - break; - } + $(menuContainer).show(); + }; + + ESX_MENU.submit = function (namespace, name, data) { + $.post( + "http://" + ESX_MENU.ResourceName + "/menu_submit", + JSON.stringify({ + _namespace: namespace, + _name: name, + current: data, + elements: ESX_MENU.opened[namespace][name].elements, + }) + ); + }; + + ESX_MENU.cancel = function (namespace, name) { + $.post( + "http://" + ESX_MENU.ResourceName + "/menu_cancel", + JSON.stringify({ + _namespace: namespace, + _name: name, + }) + ); + }; + + ESX_MENU.change = function (namespace, name, data) { + $.post( + "http://" + ESX_MENU.ResourceName + "/menu_change", + JSON.stringify({ + _namespace: namespace, + _name: name, + current: data, + elements: ESX_MENU.opened[namespace][name].elements, + }) + ); + }; + + ESX_MENU.getFocused = function () { + return ESX_MENU.focus[ESX_MENU.focus.length - 1]; + }; + + window.onData = (data) => { + switch (data.action) { + case "openMenu": { + ESX_MENU.open(data.namespace, data.name, data.data); + break; + } - $("#menu_" + focused.namespace + "_" + focused.name) - .find(".menu-item.selected")[0] - .scrollIntoView(); + case "closeMenu": { + ESX_MENU.close(data.namespace, data.name); + break; } - break; - } + case "controlPressed": { + switch (data.control) { + case "ENTER": { + let focused = ESX_MENU.getFocused(); - case "RIGHT": { - let focused = ESX_MENU.getFocused(); + if (typeof focused != "undefined") { + let menu = ESX_MENU.opened[focused.namespace][focused.name]; + let pos = ESX_MENU.pos[focused.namespace][focused.name]; + let elem = menu.elements[pos]; - if (typeof focused != "undefined") { - let menu = ESX_MENU.opened[focused.namespace][focused.name]; - let pos = ESX_MENU.pos[focused.namespace][focused.name]; - let elem = menu.elements[pos]; + if (menu.elements.length > 0) { + ESX_MENU.submit(focused.namespace, focused.name, elem); + } + } + + break; + } - switch (elem.type) { - case "default": - break; + case "BACKSPACE": { + let focused = ESX_MENU.getFocused(); - case "slider": { - if (typeof elem.options != "undefined" && elem.value < elem.options.length - 1) { - elem.value++; - ESX_MENU.change(focused.namespace, focused.name, elem); - } + if (typeof focused != "undefined") { + ESX_MENU.cancel(focused.namespace, focused.name); + } - if (typeof elem.max != "undefined" && elem.value < elem.max) { - elem.value++; - ESX_MENU.change(focused.namespace, focused.name, elem); - } + break; + } + + case "TOP": { + let focused = ESX_MENU.getFocused(); + + if (typeof focused != "undefined") { + let menu = ESX_MENU.opened[focused.namespace][focused.name]; + let pos = ESX_MENU.pos[focused.namespace][focused.name]; + + if (pos > 0) { + ESX_MENU.pos[focused.namespace][focused.name]--; + } else { + ESX_MENU.pos[focused.namespace][focused.name] = menu.elements.length - 1; + } - ESX_MENU.render(); - break; + let elem = menu.elements[ESX_MENU.pos[focused.namespace][focused.name]]; + + for (let i = 0; i < menu.elements.length; i++) { + if (i === ESX_MENU.pos[focused.namespace][focused.name]) { + menu.elements[i].selected = true; + } else { + menu.elements[i].selected = false; + } + } + + ESX_MENU.change(focused.namespace, focused.name, elem); + ESX_MENU.render(); + + $("#menu_" + focused.namespace + "_" + focused.name) + .find(".menu-item.selected")[0] + .scrollIntoView(); + } + + break; + } + + case "DOWN": { + let focused = ESX_MENU.getFocused(); + + if (typeof focused != "undefined") { + let menu = ESX_MENU.opened[focused.namespace][focused.name]; + let pos = ESX_MENU.pos[focused.namespace][focused.name]; + let length = menu.elements.length; + + if (pos < length - 1) { + ESX_MENU.pos[focused.namespace][focused.name]++; + } else { + ESX_MENU.pos[focused.namespace][focused.name] = 0; + } + + let elem = menu.elements[ESX_MENU.pos[focused.namespace][focused.name]]; + + for (let i = 0; i < menu.elements.length; i++) { + if (i === ESX_MENU.pos[focused.namespace][focused.name]) { + menu.elements[i].selected = true; + } else { + menu.elements[i].selected = false; + } + } + + ESX_MENU.change(focused.namespace, focused.name, elem); + ESX_MENU.render(); + + $("#menu_" + focused.namespace + "_" + focused.name) + .find(".menu-item.selected")[0] + .scrollIntoView(); + } + + break; + } + + case "LEFT": { + let focused = ESX_MENU.getFocused(); + + if (typeof focused != "undefined") { + let menu = ESX_MENU.opened[focused.namespace][focused.name]; + let pos = ESX_MENU.pos[focused.namespace][focused.name]; + let elem = menu.elements[pos]; + + switch (elem.type) { + case "default": + break; + + case "slider": { + let min = typeof elem.min === "undefined" ? 0 : elem.min; + + if (elem.value > min) { + elem.value--; + ESX_MENU.change(focused.namespace, focused.name, elem); + } + + ESX_MENU.render(); + break; + } + + default: + break; + } + + $("#menu_" + focused.namespace + "_" + focused.name) + .find(".menu-item.selected")[0] + .scrollIntoView(); + } + + break; + } + + case "RIGHT": { + let focused = ESX_MENU.getFocused(); + + if (typeof focused != "undefined") { + let menu = ESX_MENU.opened[focused.namespace][focused.name]; + let pos = ESX_MENU.pos[focused.namespace][focused.name]; + let elem = menu.elements[pos]; + + switch (elem.type) { + case "default": + break; + + case "slider": { + if (typeof elem.options != "undefined" && elem.value < elem.options.length - 1) { + elem.value++; + ESX_MENU.change(focused.namespace, focused.name, elem); + } + + if (typeof elem.max != "undefined" && elem.value < elem.max) { + elem.value++; + ESX_MENU.change(focused.namespace, focused.name, elem); + } + + ESX_MENU.render(); + break; + } + + default: + break; + } + + $("#menu_" + focused.namespace + "_" + focused.name) + .find(".menu-item.selected")[0] + .scrollIntoView(); + } + + break; + } + + default: + break; } - default: - break; - } - - $("#menu_" + focused.namespace + "_" + focused.name) - .find(".menu-item.selected")[0] - .scrollIntoView(); + break; } - - break; - } - - default: - break; } - - break; - } - } - }; - - window.onload = function (e) { - window.addEventListener("message", (event) => { - onData(event.data); - }); - }; -})(); \ No newline at end of file + }; + + window.onload = function (e) { + window.addEventListener("message", (event) => { + onData(event.data); + }); + }; +})(); diff --git a/server-data/resources/[esx]/esx_menu_default/html/js/mustache.min.js b/server-data/resources/[esx]/esx_menu_default/html/js/mustache.min.js index 773d0ad36..f36565977 100644 --- a/server-data/resources/[esx]/esx_menu_default/html/js/mustache.min.js +++ b/server-data/resources/[esx]/esx_menu_default/html/js/mustache.min.js @@ -344,4 +344,4 @@ mustache.Context = Context; mustache.Writer = Writer; return mustache; -}); \ No newline at end of file +}); From 771e67619e6d45cf884d8762b6b65c7fdee9fd06 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:23:36 +0100 Subject: [PATCH 08/18] chore: esx_menu_dialog updated to version 1.0.1 + Run formatter --- .../[esx]/esx_menu_dialog/fxmanifest.lua | 5 ++- .../[esx]/esx_menu_dialog/html/css/app.css | 2 +- .../[esx]/esx_menu_dialog/html/ui.html | 32 +++++++++++-------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/server-data/resources/[esx]/esx_menu_dialog/fxmanifest.lua b/server-data/resources/[esx]/esx_menu_dialog/fxmanifest.lua index 5c30fb64f..b8e8e61a4 100644 --- a/server-data/resources/[esx]/esx_menu_dialog/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_menu_dialog/fxmanifest.lua @@ -3,7 +3,7 @@ fx_version("adamant") game("gta5") description("ESX Menu Dialog") lua54("yes") -version("1.0.0") +version("1.0.1") client_scripts({ "@es_extended/imports.lua", @@ -15,9 +15,12 @@ ui_page("html/ui.html") files({ "html/ui.html", + "html/css/app.css", + "html/js/mustache.min.js", "html/js/app.js", + "html/fonts/pdown.ttf", "html/fonts/bankgothic.ttf", }) diff --git a/server-data/resources/[esx]/esx_menu_dialog/html/css/app.css b/server-data/resources/[esx]/esx_menu_dialog/html/css/app.css index 20b399235..b30107f0d 100644 --- a/server-data/resources/[esx]/esx_menu_dialog/html/css/app.css +++ b/server-data/resources/[esx]/esx_menu_dialog/html/css/app.css @@ -129,4 +129,4 @@ background: #00e1ff; height: 2px; margin: 0px 3px; -} +} \ No newline at end of file diff --git a/server-data/resources/[esx]/esx_menu_dialog/html/ui.html b/server-data/resources/[esx]/esx_menu_dialog/html/ui.html index ddbde0892..c542d10eb 100644 --- a/server-data/resources/[esx]/esx_menu_dialog/html/ui.html +++ b/server-data/resources/[esx]/esx_menu_dialog/html/ui.html @@ -1,17 +1,21 @@ - - - - - - - - + + + + + + - - - - - - + + + + + + + + + + \ No newline at end of file From 48454e4135a6a0e0680b36c10086f00d3127d85e Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:26:05 +0100 Subject: [PATCH 09/18] chore: esx_menu_list updated to version 1.0.1 --- server-data/resources/[esx]/esx_menu_list/fxmanifest.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server-data/resources/[esx]/esx_menu_list/fxmanifest.lua b/server-data/resources/[esx]/esx_menu_list/fxmanifest.lua index 319a4fe06..318743ca5 100644 --- a/server-data/resources/[esx]/esx_menu_list/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_menu_list/fxmanifest.lua @@ -3,7 +3,7 @@ fx_version("adamant") game("gta5") description("ESX Menu List") lua54("yes") -version("1.0.0") +version("1.0.1") client_scripts({ "@es_extended/imports.lua", @@ -15,9 +15,12 @@ ui_page("html/ui.html") files({ "html/ui.html", + "html/css/app.css", + "html/js/mustache.min.js", "html/js/app.js", + "html/fonts/pdown.ttf", "html/fonts/bankgothic.ttf", }) From efacccd603ee455e9d7f0c496cc48a90d2d6cafa Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:31:57 +0100 Subject: [PATCH 10/18] chore: esx_multicharacter updated to version 1.0.1 --- .../[esx]/esx_multicharacter/client/main.lua | 731 ++++++++---------- .../[esx]/esx_multicharacter/config.lua | 2 +- .../[esx]/esx_multicharacter/fxmanifest.lua | 2 +- .../esx_multicharacter/server/commands.lua | 46 +- .../[esx]/esx_multicharacter/server/main.lua | 410 +++++----- 5 files changed, 578 insertions(+), 613 deletions(-) diff --git a/server-data/resources/[esx]/esx_multicharacter/client/main.lua b/server-data/resources/[esx]/esx_multicharacter/client/main.lua index 0d655fa5d..556ccfe37 100644 --- a/server-data/resources/[esx]/esx_multicharacter/client/main.lua +++ b/server-data/resources/[esx]/esx_multicharacter/client/main.lua @@ -4,416 +4,361 @@ local mp_f_freemode_01 = `mp_f_freemode_01` local SpawnCoords = Config.Spawn[math.random(#Config.Spawn)] if ESX.GetConfig().Multichar then - CreateThread(function() - while not ESX.PlayerLoaded do - Wait(100) + CreateThread(function() + while not ESX.PlayerLoaded do + Wait(100) - if NetworkIsPlayerActive(PlayerId()) then - exports.spawnmanager:setAutoSpawn(false) - DoScreenFadeOut(0) - while GetResourceState("esx_context") ~= "started" do - Wait(100) - end - TriggerEvent("esx_multicharacter:SetupCharacters") - break - end - end - end) + if NetworkIsPlayerActive(PlayerId()) then + exports.spawnmanager:setAutoSpawn(false) + DoScreenFadeOut(0) + while GetResourceState("esx_context") ~= "started" do + Wait(100) + end + TriggerEvent("esx_multicharacter:SetupCharacters") + break + end + end + end) - local canRelog, cam, spawned = true, nil, nil - local Characters = {} + local canRelog, cam, spawned = true, nil, nil + local Characters = {} - RegisterNetEvent("esx_multicharacter:SetupCharacters") - AddEventHandler("esx_multicharacter:SetupCharacters", function() - ESX.PlayerLoaded = false - ESX.PlayerData = {} - spawned = false - cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) - local playerPed = PlayerPedId() - SetEntityCoords(playerPed, SpawnCoords.x, SpawnCoords.y, SpawnCoords.z, true, false, false, false) - SetEntityHeading(playerPed, SpawnCoords.w) - local offset = GetOffsetFromEntityInWorldCoords(playerPed, 0, 1.7, 0.4) - DoScreenFadeOut(0) - SetCamActive(cam, true) - RenderScriptCams(true, false, 1, true, true) - SetCamCoord(cam, offset.x, offset.y, offset.z) - PointCamAtCoord(cam, SpawnCoords.x, SpawnCoords.y, SpawnCoords.z + 1.3) - StartLoop() - ShutdownLoadingScreen() - ShutdownLoadingScreenNui() - TriggerEvent("esx:loadingScreenOff") - Wait(200) - TriggerServerEvent("esx_multicharacter:SetupCharacters") - end) + RegisterNetEvent("esx_multicharacter:SetupCharacters") + AddEventHandler("esx_multicharacter:SetupCharacters", function() + ESX.PlayerLoaded = false + ESX.PlayerData = {} + spawned = false + cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) + local playerPed = PlayerPedId() + SetEntityCoords(playerPed, SpawnCoords.x, SpawnCoords.y, SpawnCoords.z, true, false, false, false) + SetEntityHeading(playerPed, SpawnCoords.w) + local offset = GetOffsetFromEntityInWorldCoords(playerPed, 0, 1.7, 0.4) + DoScreenFadeOut(0) + SetCamActive(cam, true) + RenderScriptCams(true, false, 1, true, true) + SetCamCoord(cam, offset.x, offset.y, offset.z) + PointCamAtCoord(cam, SpawnCoords.x, SpawnCoords.y, SpawnCoords.z + 1.3) + StartLoop() + ShutdownLoadingScreen() + ShutdownLoadingScreenNui() + TriggerEvent("esx:loadingScreenOff") + Wait(200) + TriggerServerEvent("esx_multicharacter:SetupCharacters") + end) - StartLoop = function() - hidePlayers = true - MumbleSetVolumeOverride(PlayerId(), 0.0) - CreateThread(function() - local keys = { 18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109, 209, 19 } - while hidePlayers do - DisableAllControlActions(0) - for i = 1, #keys do - EnableControlAction(0, keys[i], true) - end - SetEntityVisible(PlayerPedId(), 0, 0) - SetLocalPlayerVisibleLocally(1) - SetPlayerInvincible(PlayerId(), 1) - ThefeedHideThisFrame() - HideHudComponentThisFrame(11) - HideHudComponentThisFrame(12) - HideHudComponentThisFrame(21) - HideHudAndRadarThisFrame() - Wait(0) - local vehicles = GetGamePool("CVehicle") - for i = 1, #vehicles do - SetEntityLocallyInvisible(vehicles[i]) - end - end - local playerId, playerPed = PlayerId(), PlayerPedId() - MumbleSetVolumeOverride(playerId, -1.0) - SetEntityVisible(playerPed, 1, 0) - SetPlayerInvincible(playerId, 0) - FreezeEntityPosition(playerPed, false) - Wait(10000) - canRelog = true - end) - CreateThread(function() - local playerPool = {} - while hidePlayers do - local players = GetActivePlayers() - for i = 1, #players do - local player = players[i] - if player ~= PlayerId() and not playerPool[player] then - playerPool[player] = true - NetworkConcealPlayer(player, true, true) - end - end - Wait(500) - end - for k in pairs(playerPool) do - NetworkConcealPlayer(k, false, false) - end - end) - end + StartLoop = function() + hidePlayers = true + MumbleSetVolumeOverride(PlayerId(), 0.0) + CreateThread(function() + local keys = { 18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109, 209, 19 } + while hidePlayers do + DisableAllControlActions(0) + for i = 1, #keys do + EnableControlAction(0, keys[i], true) + end + SetEntityVisible(PlayerPedId(), 0, 0) + SetLocalPlayerVisibleLocally(1) + SetPlayerInvincible(PlayerId(), 1) + ThefeedHideThisFrame() + HideHudComponentThisFrame(11) + HideHudComponentThisFrame(12) + HideHudComponentThisFrame(21) + HideHudAndRadarThisFrame() + Wait(0) + local vehicles = GetGamePool("CVehicle") + for i = 1, #vehicles do + SetEntityLocallyInvisible(vehicles[i]) + end + end + local playerId, playerPed = PlayerId(), PlayerPedId() + MumbleSetVolumeOverride(playerId, -1.0) + SetEntityVisible(playerPed, 1, 0) + SetPlayerInvincible(playerId, 0) + FreezeEntityPosition(playerPed, false) + Wait(10000) + canRelog = true + end) + CreateThread(function() + local playerPool = {} + while hidePlayers do + local players = GetActivePlayers() + for i = 1, #players do + local player = players[i] + if player ~= PlayerId() and not playerPool[player] then + playerPool[player] = true + NetworkConcealPlayer(player, true, true) + end + end + Wait(500) + end + for k in pairs(playerPool) do + NetworkConcealPlayer(k, false, false) + end + end) + end - SetupCharacter = function(index) - if not spawned then - exports.spawnmanager:spawnPlayer({ - x = SpawnCoords.x, - y = SpawnCoords.y, - z = SpawnCoords.z, - heading = SpawnCoords.w, - model = Characters[index].model or mp_m_freemode_01, - skipFade = true, - }, function() - canRelog = false - if Characters[index] then - local skin = Characters[index].skin or Config.Default - if not Characters[index].model then - if Characters[index].sex == _U("female") then - skin.sex = 1 - else - skin.sex = 0 - end - end - TriggerEvent("skinchanger:loadSkin", skin) - end - DoScreenFadeIn(600) - end) - repeat - Wait(200) - until not IsScreenFadedOut() - elseif Characters[index] and Characters[index].skin then - if Characters[spawned] and Characters[spawned].model then - RequestModel(Characters[index].model) - while not HasModelLoaded(Characters[index].model) do - RequestModel(Characters[index].model) - Wait(0) - end - SetPlayerModel(PlayerId(), Characters[index].model) - SetModelAsNoLongerNeeded(Characters[index].model) - end - TriggerEvent("skinchanger:loadSkin", Characters[index].skin) - end - spawned = index - local playerPed = PlayerPedId() - FreezeEntityPosition(PlayerPedId(), true) - SetPedAoBlobRendering(playerPed, true) - SetEntityAlpha(playerPed, 255) - SendNUIMessage({ - action = "openui", - character = Characters[spawned], - }) - end + SetupCharacter = function(index) + if not spawned then + exports.spawnmanager:spawnPlayer({ + x = SpawnCoords.x, + y = SpawnCoords.y, + z = SpawnCoords.z, + heading = SpawnCoords.w, + model = Characters[index].model or mp_m_freemode_01, + skipFade = true, + }, function() + canRelog = false + if Characters[index] then + local skin = Characters[index].skin or Config.Default + if not Characters[index].model then + if Characters[index].sex == TranslateCap("female") then + skin.sex = 1 + else + skin.sex = 0 + end + end + TriggerEvent("skinchanger:loadSkin", skin) + end + DoScreenFadeIn(600) + end) + repeat + Wait(200) + until not IsScreenFadedOut() + elseif Characters[index] and Characters[index].skin then + if Characters[spawned] and Characters[spawned].model then + RequestModel(Characters[index].model) + while not HasModelLoaded(Characters[index].model) do + RequestModel(Characters[index].model) + Wait(0) + end + SetPlayerModel(PlayerId(), Characters[index].model) + SetModelAsNoLongerNeeded(Characters[index].model) + end + TriggerEvent("skinchanger:loadSkin", Characters[index].skin) + end + spawned = index + local playerPed = PlayerPedId() + FreezeEntityPosition(PlayerPedId(), true) + SetPedAoBlobRendering(playerPed, true) + SetEntityAlpha(playerPed, 255) + SendNUIMessage({ + action = "openui", + character = Characters[spawned], + }) + end - function CharacterDeleteConfirmation(Characters, slots, SelectedCharacter, value) - local elements = { - { - title = _U("char_delete_confirmation"), - icon = "fa-solid fa-users", - description = _U("char_delete_confirmation_description"), - unselectable = true, - }, - { - title = _U("char_delete"), - icon = "fa-solid fa-xmark", - description = _U("char_delete_yes_description"), - action = "delete", - value = value, - }, - { - title = _U("return"), - unselectable = false, - icon = "fa-solid fa-arrow-left", - description = _U("char_delete_no_description"), - action = "return", - }, - } + function CharacterDeleteConfirmation(Characters, slots, SelectedCharacter, value) + local elements = { + { title = TranslateCap("char_delete_confirmation"), icon = "fa-solid fa-users", description = TranslateCap("char_delete_confirmation_description"), unselectable = true }, + { title = TranslateCap("char_delete"), icon = "fa-solid fa-xmark", description = TranslateCap("char_delete_yes_description"), action = "delete", value = value }, + { title = TranslateCap("return"), unselectable = false, icon = "fa-solid fa-arrow-left", description = TranslateCap("char_delete_no_description"), action = "return" }, + } - ESX.OpenContext("left", elements, function(_, Action) - if Action.action == "delete" then - ESX.CloseContext() - TriggerServerEvent("esx_multicharacter:DeleteCharacter", Action.value) - spawned = false - elseif Action.action == "return" then - CharacterOptions(Characters, slots, SelectedCharacter) - end - end, nil, false) - end + ESX.OpenContext("left", elements, function(_, Action) + if Action.action == "delete" then + ESX.CloseContext() + TriggerServerEvent("esx_multicharacter:DeleteCharacter", Action.value) + spawned = false + elseif Action.action == "return" then + CharacterOptions(Characters, slots, SelectedCharacter) + end + end, nil, false) + end - function CharacterOptions(Characters, slots, SelectedCharacter) - local elements = { - { - title = _U( - "character", - Characters[SelectedCharacter.value].firstname .. " " .. Characters[SelectedCharacter.value].lastname - ), - icon = "fa-regular fa-user", - unselectable = true, - }, - { - title = _U("return"), - unselectable = false, - icon = "fa-solid fa-arrow-left", - description = _U("return_description"), - action = "return", - }, - } - if not Characters[SelectedCharacter.value].disabled then - elements[3] = { - title = _U("char_play"), - description = _U("char_play_description"), - icon = "fa-solid fa-play", - action = "play", - value = SelectedCharacter.value, - } - else - elements[3] = { - title = _U("char_disabled"), - value = SelectedCharacter.value, - icon = "fa-solid fa-xmark", - description = _U("char_disabled_description"), - } - end - if Config.CanDelete then - elements[4] = { - title = _U("char_delete"), - icon = "fa-solid fa-xmark", - description = _U("char_delete_description"), - action = "delete", - value = SelectedCharacter.value, - } - end - ESX.OpenContext("left", elements, function(_, Action) - if Action.action == "play" then - SendNUIMessage({ - action = "closeui", - }) - ESX.CloseContext() - TriggerServerEvent("esx_multicharacter:CharacterChosen", Action.value, false) - elseif Action.action == "delete" then - CharacterDeleteConfirmation(Characters, slots, SelectedCharacter, Action.value) - elseif Action.action == "return" then - SelectCharacterMenu(Characters, slots) - end - end, nil, false) - end + function CharacterOptions(Characters, slots, SelectedCharacter) + local elements = { + { title = TranslateCap("character", Characters[SelectedCharacter.value].firstname .. " " .. Characters[SelectedCharacter.value].lastname), icon = "fa-regular fa-user", unselectable = true }, + { title = TranslateCap("return"), unselectable = false, icon = "fa-solid fa-arrow-left", description = TranslateCap("return_description"), action = "return" }, + } + if not Characters[SelectedCharacter.value].disabled then + elements[3] = { title = TranslateCap("char_play"), description = TranslateCap("char_play_description"), icon = "fa-solid fa-play", action = "play", value = SelectedCharacter.value } + else + elements[3] = { title = TranslateCap("char_disabled"), value = SelectedCharacter.value, icon = "fa-solid fa-xmark", description = TranslateCap("char_disabled_description") } + end + if Config.CanDelete then + elements[4] = { title = TranslateCap("char_delete"), icon = "fa-solid fa-xmark", description = TranslateCap("char_delete_description"), action = "delete", value = SelectedCharacter.value } + end + ESX.OpenContext("left", elements, function(_, Action) + if Action.action == "play" then + SendNUIMessage({ + action = "closeui", + }) + ESX.CloseContext() + TriggerServerEvent("esx_multicharacter:CharacterChosen", Action.value, false) + elseif Action.action == "delete" then + CharacterDeleteConfirmation(Characters, slots, SelectedCharacter, Action.value) + elseif Action.action == "return" then + SelectCharacterMenu(Characters, slots) + end + end, nil, false) + end - function SelectCharacterMenu(Characters, slots) - local Character = next(Characters) - local elements = { - { - title = _U("select_char"), - icon = "fa-solid fa-users", - description = _U("select_char_description"), - unselectable = true, - }, - } - for k, v in pairs(Characters) do - if not v.model and v.skin then - if v.skin.model then - v.model = v.skin.model - elseif v.skin.sex == 1 then - v.model = mp_f_freemode_01 - else - v.model = mp_m_freemode_01 - end - end - if not spawned then - SetupCharacter(Character) - end - local label = v.firstname .. " " .. v.lastname - if Characters[k].disabled then - elements[#elements + 1] = { title = label, icon = "fa-regular fa-user", value = v.id } - else - elements[#elements + 1] = { title = label, icon = "fa-regular fa-user", value = v.id } - end - end - if #elements - 1 < slots then - elements[#elements + 1] = - { title = _U("create_char"), icon = "fa-solid fa-plus", value = (#elements + 1), new = true } - end + function SelectCharacterMenu(Characters, slots) + local Character = next(Characters) + local elements = { { title = TranslateCap("select_char"), icon = "fa-solid fa-users", description = TranslateCap("select_char_description"), unselectable = true } } + for k, v in pairs(Characters) do + if not v.model and v.skin then + if v.skin.model then + v.model = v.skin.model + elseif v.skin.sex == 1 then + v.model = mp_f_freemode_01 + else + v.model = mp_m_freemode_01 + end + end + if not spawned then + SetupCharacter(Character) + end + local label = v.firstname .. " " .. v.lastname + if Characters[k].disabled then + elements[#elements + 1] = { title = label, icon = "fa-regular fa-user", value = v.id } + else + elements[#elements + 1] = { title = label, icon = "fa-regular fa-user", value = v.id } + end + end + if #elements - 1 < slots then + elements[#elements + 1] = { title = TranslateCap("create_char"), icon = "fa-solid fa-plus", value = (#elements + 1), new = true } + end - ESX.OpenContext("left", elements, function(_, SelectedCharacter) - if SelectedCharacter.new then - ESX.CloseContext() - local GetSlot = function() - for i = 1, slots do - if not Characters[i] then - return i - end - end - end - local slot = GetSlot() - TriggerServerEvent("esx_multicharacter:CharacterChosen", slot, true) - TriggerEvent("esx_identity:showRegisterIdentity") - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, false) - SetEntityAlpha(playerPed, 0) - SendNUIMessage({ - action = "closeui", - }) - else - CharacterOptions(Characters, slots, SelectedCharacter) - SetupCharacter(SelectedCharacter.value) - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, true) - ResetEntityAlpha(playerPed) - end - end, nil, false) - end + ESX.OpenContext("left", elements, function(_, SelectedCharacter) + if SelectedCharacter.new then + ESX.CloseContext() + local GetSlot = function() + for i = 1, slots do + if not Characters[i] then + return i + end + end + end + local slot = GetSlot() + TriggerServerEvent("esx_multicharacter:CharacterChosen", slot, true) + TriggerEvent("esx_identity:showRegisterIdentity") + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, false) + SetEntityAlpha(playerPed, 0) + SendNUIMessage({ + action = "closeui", + }) + else + CharacterOptions(Characters, slots, SelectedCharacter) + SetupCharacter(SelectedCharacter.value) + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, true) + ResetEntityAlpha(playerPed) + end + end, nil, false) + end - RegisterNetEvent("esx_multicharacter:SetupUI") - AddEventHandler("esx_multicharacter:SetupUI", function(data, slots) - DoScreenFadeOut(0) - Characters = data - slots = slots - local Character = next(Characters) - exports.spawnmanager:forceRespawn() + RegisterNetEvent("esx_multicharacter:SetupUI") + AddEventHandler("esx_multicharacter:SetupUI", function(data, slots) + DoScreenFadeOut(0) + Characters = data + slots = slots + local Character = next(Characters) + exports.spawnmanager:forceRespawn() - if not Character then - SendNUIMessage({ - action = "closeui", - }) - exports.spawnmanager:spawnPlayer({ - x = SpawnCoords.x, - y = SpawnCoords.y, - z = SpawnCoords.z, - heading = SpawnCoords.w, - model = mp_m_freemode_01, - skipFade = true, - }, function() - canRelog = false - DoScreenFadeIn(400) - Wait(400) - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, false) - SetEntityAlpha(playerPed, 0) - TriggerServerEvent("esx_multicharacter:CharacterChosen", 1, true) - TriggerEvent("esx_identity:showRegisterIdentity") - end) - else - SelectCharacterMenu(Characters, slots) - end - end) + if not Character then + SendNUIMessage({ + action = "closeui", + }) + exports.spawnmanager:spawnPlayer({ + x = SpawnCoords.x, + y = SpawnCoords.y, + z = SpawnCoords.z, + heading = SpawnCoords.w, + model = mp_m_freemode_01, + skipFade = true, + }, function() + canRelog = false + DoScreenFadeIn(400) + Wait(400) + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, false) + SetEntityAlpha(playerPed, 0) + TriggerServerEvent("esx_multicharacter:CharacterChosen", 1, true) + TriggerEvent("esx_identity:showRegisterIdentity") + end) + else + SelectCharacterMenu(Characters, slots) + end + end) - RegisterNetEvent("esx:playerLoaded") - AddEventHandler("esx:playerLoaded", function(playerData, isNew, skin) - local spawn = playerData.coords or Config.Spawn - if isNew or not skin or #skin == 1 then - local finished = false - skin = Config.Default[playerData.sex] - skin.sex = playerData.sex == "m" and 0 or 1 - local model = skin.sex == 0 and mp_m_freemode_01 or mp_f_freemode_01 - RequestModel(model) - while not HasModelLoaded(model) do - RequestModel(model) - Wait(0) - end - SetPlayerModel(PlayerId(), model) - SetModelAsNoLongerNeeded(model) - TriggerEvent("skinchanger:loadSkin", skin, function() - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, true) - ResetEntityAlpha(playerPed) - TriggerEvent("esx_skin:openSaveableMenu", function() - finished = true - end, function() - finished = true - end) - end) - repeat - Wait(200) - until finished - end + RegisterNetEvent("esx:playerLoaded") + AddEventHandler("esx:playerLoaded", function(playerData, isNew, skin) + local spawn = playerData.coords or Config.Spawn + if isNew or not skin or #skin == 1 then + local finished = false + skin = Config.Default[playerData.sex] + skin.sex = playerData.sex == "m" and 0 or 1 + local model = skin.sex == 0 and mp_m_freemode_01 or mp_f_freemode_01 + RequestModel(model) + while not HasModelLoaded(model) do + RequestModel(model) + Wait(0) + end + SetPlayerModel(PlayerId(), model) + SetModelAsNoLongerNeeded(model) + TriggerEvent("skinchanger:loadSkin", skin, function() + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, true) + ResetEntityAlpha(playerPed) + TriggerEvent("esx_skin:openSaveableMenu", function() + finished = true + end, function() + finished = true + end) + end) + repeat + Wait(200) + until finished + end - DoScreenFadeOut(750) - Wait(750) + DoScreenFadeOut(750) + Wait(750) - SetCamActive(cam, false) - RenderScriptCams(false, false, 0, true, true) - cam = nil - local playerPed = PlayerPedId() - FreezeEntityPosition(playerPed, true) - SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true) - SetEntityHeading(playerPed, spawn.heading) - if not isNew then - TriggerEvent("skinchanger:loadSkin", skin or Characters[spawned].skin) - end - Wait(500) + SetCamActive(cam, false) + RenderScriptCams(false, false, 0, true, true) + cam = nil + local playerPed = PlayerPedId() + FreezeEntityPosition(playerPed, true) + SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true) + SetEntityHeading(playerPed, spawn.heading) + if not isNew then + TriggerEvent("skinchanger:loadSkin", skin or Characters[spawned].skin) + end + Wait(500) - DoScreenFadeIn(750) - Wait(750) + DoScreenFadeIn(750) + Wait(750) - repeat - Wait(200) - until not IsScreenFadedOut() - TriggerServerEvent("esx:onPlayerSpawn") - TriggerEvent("esx:onPlayerSpawn") - TriggerEvent("playerSpawned") - TriggerEvent("esx:restoreLoadout") - Characters, hidePlayers = {}, false - end) + repeat + Wait(200) + until not IsScreenFadedOut() + TriggerServerEvent("esx:onPlayerSpawn") + TriggerEvent("esx:onPlayerSpawn") + TriggerEvent("playerSpawned") + TriggerEvent("esx:restoreLoadout") + Characters, hidePlayers = {}, false + end) - RegisterNetEvent("esx:onPlayerLogout") - AddEventHandler("esx:onPlayerLogout", function() - DoScreenFadeOut(500) - Wait(1000) - spawned = false - TriggerEvent("esx_multicharacter:SetupCharacters") - TriggerEvent("esx_skin:resetFirstSpawn") - end) + RegisterNetEvent("esx:onPlayerLogout") + AddEventHandler("esx:onPlayerLogout", function() + DoScreenFadeOut(500) + Wait(1000) + spawned = false + TriggerEvent("esx_multicharacter:SetupCharacters") + TriggerEvent("esx_skin:resetFirstSpawn") + end) - if Config.Relog then - RegisterCommand("relog", function() - if canRelog then - canRelog = false - TriggerServerEvent("esx_multicharacter:relog") - ESX.SetTimeout(10000, function() - canRelog = true - end) - end - end) - end + if Config.Relog then + RegisterCommand("relog", function() + if canRelog then + canRelog = false + TriggerServerEvent("esx_multicharacter:relog") + ESX.SetTimeout(10000, function() + canRelog = true + end) + end + end) + end end diff --git a/server-data/resources/[esx]/esx_multicharacter/config.lua b/server-data/resources/[esx]/esx_multicharacter/config.lua index f4002af82..7c174f1cc 100644 --- a/server-data/resources/[esx]/esx_multicharacter/config.lua +++ b/server-data/resources/[esx]/esx_multicharacter/config.lua @@ -1,5 +1,5 @@ Config = {} -Config.Locale = "it" +Config.Locale = GetConvar("esx:locale", "en") -- Allows players to delete their characters Config.CanDelete = true diff --git a/server-data/resources/[esx]/esx_multicharacter/fxmanifest.lua b/server-data/resources/[esx]/esx_multicharacter/fxmanifest.lua index cec3f9920..992bf8389 100644 --- a/server-data/resources/[esx]/esx_multicharacter/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_multicharacter/fxmanifest.lua @@ -3,7 +3,7 @@ fx_version("cerulean") game("gta5") author("ESX-Framework - Linden - KASH") description("Official Multicharacter System For ESX Legacy") -version("1.0.0") +version("1.0.1") lua54("yes") dependencies({ "es_extended", "esx_context", "esx_identity", "esx_skin" }) diff --git a/server-data/resources/[esx]/esx_multicharacter/server/commands.lua b/server-data/resources/[esx]/esx_multicharacter/server/commands.lua index e5b66d297..c666bcaf4 100644 --- a/server-data/resources/[esx]/esx_multicharacter/server/commands.lua +++ b/server-data/resources/[esx]/esx_multicharacter/server/commands.lua @@ -9,15 +9,15 @@ ESX.RegisterCommand( args.slots, } ) - xPlayer.triggerEvent("esx:showNotification", _U("slotsadd", args.slots, args.identifier)) + xPlayer.triggerEvent("esx:showNotification", TranslateCap("slotsadd", args.slots, args.identifier)) end, true, { - help = _U("command_setslots"), + help = TranslateCap("command_setslots"), validate = true, arguments = { - { name = "identifier", help = _U("command_identifier"), type = "string" }, - { name = "slots", help = _U("command_slots"), type = "number" }, + { name = "identifier", help = TranslateCap("command_identifier"), type = "string" }, + { name = "slots", help = TranslateCap("command_slots"), type = "number" }, }, } ) @@ -34,15 +34,15 @@ ESX.RegisterCommand( MySQL.update("DELETE FROM `multicharacter_slots` WHERE `identifier` = ?", { args.identifier, }) - xPlayer.triggerEvent("esx:showNotification", _U("slotsrem", args.identifier)) + xPlayer.triggerEvent("esx:showNotification", TranslateCap("slotsrem", args.identifier)) end end, true, { - help = _U("command_remslots"), + help = TranslateCap("command_remslots"), validate = true, arguments = { - { name = "identifier", help = _U("command_identifier"), type = "string" }, + { name = "identifier", help = TranslateCap("command_identifier"), type = "string" }, }, } ) @@ -57,19 +57,25 @@ ESX.RegisterCommand( selectedCharacter, }, function(result) if result > 0 then - xPlayer.triggerEvent("esx:showNotification", _U("charenabled", args.charslot, args.identifier)) + xPlayer.triggerEvent( + "esx:showNotification", + TranslateCap("charenabled", args.charslot, args.identifier) + ) else - xPlayer.triggerEvent("esx:showNotification", _U("charnotfound", args.charslot, args.identifier)) + xPlayer.triggerEvent( + "esx:showNotification", + TranslateCap("charnotfound", args.charslot, args.identifier) + ) end end) end, true, { - help = _U("command_enablechar"), + help = TranslateCap("command_enablechar"), validate = true, arguments = { - { name = "identifier", help = _U("command_identifier"), type = "string" }, - { name = "charslot", help = _U("command_charslot"), type = "number" }, + { name = "identifier", help = TranslateCap("command_identifier"), type = "string" }, + { name = "charslot", help = TranslateCap("command_charslot"), type = "number" }, }, } ) @@ -84,19 +90,25 @@ ESX.RegisterCommand( selectedCharacter, }, function(result) if result > 0 then - xPlayer.triggerEvent("esx:showNotification", _U("chardisabled", args.charslot, args.identifier)) + xPlayer.triggerEvent( + "esx:showNotification", + TranslateCap("chardisabled", args.charslot, args.identifier) + ) else - xPlayer.triggerEvent("esx:showNotification", _U("charnotfound", args.charslot, args.identifier)) + xPlayer.triggerEvent( + "esx:showNotification", + TranslateCap("charnotfound", args.charslot, args.identifier) + ) end end) end, true, { - help = _U("command_disablechar"), + help = TranslateCap("command_disablechar"), validate = true, arguments = { - { name = "identifier", help = _U("command_identifier"), type = "string" }, - { name = "charslot", help = _U("command_charslot"), type = "number" }, + { name = "identifier", help = TranslateCap("command_identifier"), type = "string" }, + { name = "charslot", help = TranslateCap("command_charslot"), type = "number" }, }, } ) diff --git a/server-data/resources/[esx]/esx_multicharacter/server/main.lua b/server-data/resources/[esx]/esx_multicharacter/server/main.lua index 9c0c223a2..8a5f9b2bb 100644 --- a/server-data/resources/[esx]/esx_multicharacter/server/main.lua +++ b/server-data/resources/[esx]/esx_multicharacter/server/main.lua @@ -1,240 +1,248 @@ local databaseConnected = false local databaseFound = false -local oneSyncState = GetConvar('onesync', 'off') - -local DATABASE do - local connectionString = GetConvar('mysql_connection_string', ''); - - if connectionString == '' then - error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) - elseif connectionString:find('mysql://') then - connectionString = connectionString:sub(9, -1) - DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') - databaseFound = true - else - connectionString = {string.strsplit(';', connectionString)} - - for i = 1, #connectionString do - local v = connectionString[i] - if v:match('database') then - DATABASE = v:sub(10, #v) - databaseFound = true - break - end - end - end +local oneSyncState = GetConvar("onesync", "off") + +local DATABASE +do + local connectionString = GetConvar("mysql_connection_string", "") + + if connectionString == "" then + error(connectionString .. "\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0", 0) + elseif connectionString:find("mysql://") then + connectionString = connectionString:sub(9, -1) + DATABASE = connectionString:sub(connectionString:find("/") + 1, -1):gsub("[%?]+[%w%p]*$", "") + databaseFound = true + else + connectionString = { string.strsplit(";", connectionString) } + + for i = 1, #connectionString do + local v = connectionString[i] + if v:match("database") then + DATABASE = v:sub(10, #v) + databaseFound = true + break + end + end + end end -local DB_TABLES = {users = 'identifier'} +local DB_TABLES = { users = "identifier" } local SLOTS = Config.Slots or 4 -local PREFIX = Config.Prefix or 'char' -local PRIMARY_IDENTIFIER = ESX.GetConfig().Identifier or GetConvar('sv_lan', '') == 'true' and 'ip' or "license" +local PREFIX = Config.Prefix or "char" +local PRIMARY_IDENTIFIER = ESX.GetConfig().Identifier or GetConvar("sv_lan", "") == "true" and "ip" or "license" local function GetIdentifier(source) - local fxDk = GetConvarInt('sv_fxdkMode', 0) + local fxDk = GetConvarInt("sv_fxdkMode", 0) if fxDk == 1 then return "ESX-DEBUG-LICENCE" end - + local identifier = GetPlayerIdentifierByType(source, PRIMARY_IDENTIFIER) - return identifier and identifier:gsub(PRIMARY_IDENTIFIER .. ':', '') + return identifier and identifier:gsub(PRIMARY_IDENTIFIER .. ":", "") end if next(ESX.Players) then - local players = table.clone(ESX.Players) - table.wipe(ESX.Players) - for _, v in pairs(players) do - ESX.Players[GetIdentifier(v.source)] = true - end -else ESX.Players = {} end + local players = table.clone(ESX.Players) + table.wipe(ESX.Players) + for _, v in pairs(players) do + ESX.Players[GetIdentifier(v.source)] = true + end +else + ESX.Players = {} +end local function SetupCharacters(source) - while not databaseConnected do Wait(100) end - - local identifier = GetIdentifier(source) - ESX.Players[identifier] = true - - local slots = MySQL.scalar.await('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS - identifier = PREFIX..'%:'..identifier - - local result = MySQL.query.await('SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?', {identifier, slots}) - local characters - - if result then - local characterCount = #result - characters = table.create(0, characterCount) - - for i = 1, characterCount, 1 do - local v = result[i] - local job, grade = v.job or 'unemployed', tostring(v.job_grade) - - if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then - if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end - job = ESX.Jobs[job].label - end - - local accounts = json.decode(v.accounts) - local id = tonumber(string.sub(v.identifier, #PREFIX+1, string.find(v.identifier, ':')-1)) - - characters[id] = { - id = id, - bank = accounts.bank, - money = accounts.money, - job = job, - job_grade = grade, - firstname = v.firstname, - lastname = v.lastname, - dateofbirth = v.dateofbirth, - skin = v.skin and json.decode(v.skin) or {}, - disabled = v.disabled, - sex = v.sex == 'm' and _U('male') or _U('female') - } - end - end - - TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) + while not databaseConnected do + Wait(100) + end + + local identifier = GetIdentifier(source) + ESX.Players[identifier] = true + + local slots = MySQL.scalar.await("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or SLOTS + identifier = PREFIX .. "%:" .. identifier + + local result = MySQL.query.await("SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?", { identifier, slots }) + local characters + + if result then + local characterCount = #result + characters = table.create(0, characterCount) + + for i = 1, characterCount, 1 do + local v = result[i] + local job, grade = v.job or "unemployed", tostring(v.job_grade) + + if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then + if job ~= "unemployed" then + grade = ESX.Jobs[job].grades[grade].label + else + grade = "" + end + job = ESX.Jobs[job].label + end + + local accounts = json.decode(v.accounts) + local id = tonumber(string.sub(v.identifier, #PREFIX + 1, string.find(v.identifier, ":") - 1)) + + characters[id] = { + id = id, + bank = accounts.bank, + money = accounts.money, + job = job, + job_grade = grade, + firstname = v.firstname, + lastname = v.lastname, + dateofbirth = v.dateofbirth, + skin = v.skin and json.decode(v.skin) or {}, + disabled = v.disabled, + sex = v.sex == "m" and TranslateCap("male") or TranslateCap("female"), + } + end + end + + TriggerClientEvent("esx_multicharacter:SetupUI", source, characters, slots) end -AddEventHandler('playerConnecting', function(_, _, deferrals) - deferrals.defer() - local identifier = GetIdentifier(source) - if oneSyncState == "off" or oneSyncState == "legacy" then - return deferrals.done(('[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s'):format(oneSyncState)) - end - - if not databaseFound then - deferrals.done('[ESX] Cannot Find the servers mysql_connection_string. Please make sure it is correctly configured in your server.cfg') - end - - if not databaseConnected then - deferrals.done('[ESX] OxMySQL Was Unable To Connect to your database. Please make sure it is turned on and correctly configured in your server.cfg') - end - - if identifier then - - if not ESX.GetConfig().EnableDebug then - if ESX.Players[identifier] then - deferrals.done(('[ESX Multicharacter] A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) - else - deferrals.done() - end - else - deferrals.done() - end - else - deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER)) - end +AddEventHandler("playerConnecting", function(_, _, deferrals) + deferrals.defer() + local identifier = GetIdentifier(source) + if oneSyncState == "off" or oneSyncState == "legacy" then + return deferrals.done(("[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s"):format(oneSyncState)) + end + + if not databaseFound then + deferrals.done("[ESX] Cannot Find the servers mysql_connection_string. Please make sure it is correctly configured in your server.cfg") + end + + if not databaseConnected then + deferrals.done("[ESX] OxMySQL Was Unable To Connect to your database. Please make sure it is turned on and correctly configured in your server.cfg") + end + + if identifier then + if not ESX.GetConfig().EnableDebug then + if ESX.Players[identifier] then + deferrals.done(("[ESX Multicharacter] A player is already connected to the server with this identifier.\nYour identifier: %s:%s"):format(PRIMARY_IDENTIFIER, identifier)) + else + deferrals.done() + end + else + deferrals.done() + end + else + deferrals.done(("Unable to retrieve player identifier.\nIdentifier type: %s"):format(PRIMARY_IDENTIFIER)) + end end) local function DeleteCharacter(source, charid) - local identifier = ('%s%s:%s'):format(PREFIX, charid, GetIdentifier(source)) - local query = 'DELETE FROM %s WHERE %s = ?' - local queries = {} - local count = 0 - - for table, column in pairs(DB_TABLES) do - count = count + 1 - queries[count] = {query = query:format(table, column), values = {identifier}} - end - - MySQL.transaction(queries, function(result) - if result then - print(('[^2INFO^7] Player ^5%s %s^7 has deleted a character ^5(%s)^7'):format(GetPlayerName(source), source, identifier)) - Wait(50) - SetupCharacters(source) - else - error('\n^1Transaction failed while trying to delete '..identifier..'^0') - end - end) + local identifier = ("%s%s:%s"):format(PREFIX, charid, GetIdentifier(source)) + local query = "DELETE FROM %s WHERE %s = ?" + local queries = {} + local count = 0 + + for table, column in pairs(DB_TABLES) do + count = count + 1 + queries[count] = { query = query:format(table, column), values = { identifier } } + end + + MySQL.transaction(queries, function(result) + if result then + print(("[^2INFO^7] Player ^5%s %s^7 has deleted a character ^5(%s)^7"):format(GetPlayerName(source), source, identifier)) + Wait(50) + SetupCharacters(source) + else + error("\n^1Transaction failed while trying to delete " .. identifier .. "^0") + end + end) end MySQL.ready(function() - local length = 42 + #PREFIX - local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { - {'identifier', 'owner'} - }) - - if DB_COLUMNS then - local columns = {} - local count = 0 - - for i = 1, #DB_COLUMNS do - local column = DB_COLUMNS[i] - DB_TABLES[column.TABLE_NAME] = column.COLUMN_NAME - - if column?.CHARACTER_MAXIMUM_LENGTH ~= length then - count = count + 1 - columns[column.TABLE_NAME] = column.COLUMN_NAME - end - end - - if next(columns) then - local query = 'ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(%s)' - local queries = table.create(count, 0) - - for k, v in pairs(columns) do - queries[#queries+1] = {query = query:format(k, v, length)} - end - - if MySQL.transaction.await(queries) then - print(('[^2INFO^7] Updated ^5%s^7 columns to use ^5VARCHAR(%s)^7'):format(count, length)) - else - print(('[^2INFO^7] Unable to update ^5%s^7 columns to use ^5VARCHAR(%s)^7'):format(count, length)) - end - end - - databaseConnected = true - - while not next(ESX.Jobs) do - Wait(500) - ESX.Jobs = ESX.GetJobs() - end - end + local length = 42 + #PREFIX + local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { + { "identifier", "owner" }, + }) + + if DB_COLUMNS then + local columns = {} + local count = 0 + + for i = 1, #DB_COLUMNS do + local column = DB_COLUMNS[i] + DB_TABLES[column.TABLE_NAME] = column.COLUMN_NAME + + if column?.CHARACTER_MAXIMUM_LENGTH ~= length then + count = count + 1 + columns[column.TABLE_NAME] = column.COLUMN_NAME + end + end + + if next(columns) then + local query = "ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(%s)" + local queries = table.create(count, 0) + + for k, v in pairs(columns) do + queries[#queries + 1] = { query = query:format(k, v, length) } + end + + if MySQL.transaction.await(queries) then + print(("[^2INFO^7] Updated ^5%s^7 columns to use ^5VARCHAR(%s)^7"):format(count, length)) + else + print(("[^2INFO^7] Unable to update ^5%s^7 columns to use ^5VARCHAR(%s)^7"):format(count, length)) + end + end + + databaseConnected = true + + while not next(ESX.Jobs) do + Wait(500) + ESX.Jobs = ESX.GetJobs() + end + end end) -RegisterNetEvent('esx_multicharacter:SetupCharacters', function() - SetupCharacters(source) +RegisterNetEvent("esx_multicharacter:SetupCharacters", function() + SetupCharacters(source) end) local awaitingRegistration = {} -RegisterNetEvent('esx_multicharacter:CharacterChosen', function(charid, isNew) - if type(charid) == 'number' and string.len(charid) <= 2 and type(isNew) == 'boolean' then - if isNew then - awaitingRegistration[source] = charid - else - if not ESX.GetConfig().EnableDebug then - local identifier = PREFIX..charid .. ':' .. GetIdentifier(source) - if ESX.GetPlayerFromIdentifier(identifier) then - DropPlayer(source, 'Your identifier '..identifier..' is already on the server!') - return - end - end - - TriggerEvent('esx:onPlayerJoined', source, PREFIX..charid) - ESX.Players[GetIdentifier(source)] = true - end - end +RegisterNetEvent("esx_multicharacter:CharacterChosen", function(charid, isNew) + if type(charid) == "number" and string.len(charid) <= 2 and type(isNew) == "boolean" then + if isNew then + awaitingRegistration[source] = charid + else + if not ESX.GetConfig().EnableDebug then + local identifier = PREFIX .. charid .. ":" .. GetIdentifier(source) + if ESX.GetPlayerFromIdentifier(identifier) then + DropPlayer(source, "Your identifier " .. identifier .. " is already on the server!") + return + end + end + + TriggerEvent("esx:onPlayerJoined", source, PREFIX .. charid) + ESX.Players[GetIdentifier(source)] = true + end + end end) -AddEventHandler('esx_identity:completedRegistration', function(source, data) - TriggerEvent('esx:onPlayerJoined', source, PREFIX..awaitingRegistration[source], data) - awaitingRegistration[source] = nil - ESX.Players[GetIdentifier(source)] = true +AddEventHandler("esx_identity:completedRegistration", function(source, data) + TriggerEvent("esx:onPlayerJoined", source, PREFIX .. awaitingRegistration[source], data) + awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = true end) -AddEventHandler('playerDropped', function() - awaitingRegistration[source] = nil - ESX.Players[GetIdentifier(source)] = nil +AddEventHandler("playerDropped", function() + awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = nil end) -RegisterNetEvent('esx_multicharacter:DeleteCharacter', function(charid) - if Config.CanDelete and type(charid) == 'number' and string.len(charid) <= 2 then - DeleteCharacter(source, charid) - end +RegisterNetEvent("esx_multicharacter:DeleteCharacter", function(charid) + if Config.CanDelete and type(charid) == "number" and string.len(charid) <= 2 then + DeleteCharacter(source, charid) + end end) -RegisterNetEvent('esx_multicharacter:relog', function() - local source = source - TriggerEvent('esx:playerLogout', source) +RegisterNetEvent("esx_multicharacter:relog", function() + local source = source + TriggerEvent("esx:playerLogout", source) end) From 2762250355549cd44434bf11f690f14f7861cd86 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:34:53 +0100 Subject: [PATCH 11/18] chore: esx_notify updated to version 1.0.1 --- .../resources/[esx]/esx_notify/LICENSE | 2 +- .../resources/[esx]/esx_notify/Notify.lua | 4 +-- .../resources/[esx]/esx_notify/fxmanifest.lua | 3 +- .../[esx]/esx_notify/nui/css/style.css | 2 ++ .../resources/[esx]/esx_notify/nui/index.html | 28 +++++++++++-------- .../[esx]/esx_notify/nui/js/script.js | 2 +- .../resources/[esx]/esx_notify/readme.md | 4 ++- 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/server-data/resources/[esx]/esx_notify/LICENSE b/server-data/resources/[esx]/esx_notify/LICENSE index 803b49f15..7feddc19c 100644 --- a/server-data/resources/[esx]/esx_notify/LICENSE +++ b/server-data/resources/[esx]/esx_notify/LICENSE @@ -632,7 +632,7 @@ 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. esx_menu_default - Copyright (C) 2015-2024 + Copyright (C) 2015-2024 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 diff --git a/server-data/resources/[esx]/esx_notify/Notify.lua b/server-data/resources/[esx]/esx_notify/Notify.lua index 80cf57536..1f9140ff5 100644 --- a/server-data/resources/[esx]/esx_notify/Notify.lua +++ b/server-data/resources/[esx]/esx_notify/Notify.lua @@ -25,8 +25,8 @@ local function Notify(notificatonType, length, message) end SendNuiMessage(json.encode({ - type = notificatonType, - length = length, + type = notificatonType or "info", + length = length or 3000, message = message or "ESX-Notify", })) end diff --git a/server-data/resources/[esx]/esx_notify/fxmanifest.lua b/server-data/resources/[esx]/esx_notify/fxmanifest.lua index 25cb10062..cf402da06 100644 --- a/server-data/resources/[esx]/esx_notify/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_notify/fxmanifest.lua @@ -1,7 +1,8 @@ fx_version("adamant") + lua54("yes") game("gta5") -version("1.0.0") +version("1.0.1") author("ESX-Framework") description("Official NUI Notification system for ESX") diff --git a/server-data/resources/[esx]/esx_notify/nui/css/style.css b/server-data/resources/[esx]/esx_notify/nui/css/style.css index 799e3c268..afc1a86f0 100644 --- a/server-data/resources/[esx]/esx_notify/nui/css/style.css +++ b/server-data/resources/[esx]/esx_notify/nui/css/style.css @@ -75,9 +75,11 @@ body { 0% { transform: scaleY(0); } + 80% { transform: scaleY(1.1); } + 100% { transform: scaleY(1); } diff --git a/server-data/resources/[esx]/esx_notify/nui/index.html b/server-data/resources/[esx]/esx_notify/nui/index.html index d35e3a913..a8db27dae 100644 --- a/server-data/resources/[esx]/esx_notify/nui/index.html +++ b/server-data/resources/[esx]/esx_notify/nui/index.html @@ -1,15 +1,19 @@ - - - - - - ESX Notify - - -
- -
- + + + + + + + ESX Notify + + + +
+ +
+ + \ No newline at end of file diff --git a/server-data/resources/[esx]/esx_notify/nui/js/script.js b/server-data/resources/[esx]/esx_notify/nui/js/script.js index d700017c6..a21fde57d 100644 --- a/server-data/resources/[esx]/esx_notify/nui/js/script.js +++ b/server-data/resources/[esx]/esx_notify/nui/js/script.js @@ -71,4 +71,4 @@ notification = (data) => { }, data.length); return notification; -}; \ No newline at end of file +}; diff --git a/server-data/resources/[esx]/esx_notify/readme.md b/server-data/resources/[esx]/esx_notify/readme.md index 3d064cacf..1d4398e04 100644 --- a/server-data/resources/[esx]/esx_notify/readme.md +++ b/server-data/resources/[esx]/esx_notify/readme.md @@ -1,3 +1,5 @@ +

[ESX] Notify

Discord - Website - Documentation + A beautiful and simple NUI notification system for ESX # Example Code @@ -59,4 +61,4 @@ This program Is free software: you can redistribute it And/Or modify it under th 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 . \ No newline at end of file +You should have received a copy Of the GNU General Public License along with this program. If Not, see . From d7b43ab34101d4d44dc243870bef903a51b830ba Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:37:36 +0100 Subject: [PATCH 12/18] chore: esx_progressbar updated to version 1.0.1 --- server-data/resources/[esx]/esx_progressbar/fxmanifest.lua | 7 ++++--- .../resources/[esx]/esx_progressbar/nui/js/script.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/server-data/resources/[esx]/esx_progressbar/fxmanifest.lua b/server-data/resources/[esx]/esx_progressbar/fxmanifest.lua index 8308489ba..bf374a11a 100644 --- a/server-data/resources/[esx]/esx_progressbar/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_progressbar/fxmanifest.lua @@ -1,9 +1,10 @@ fx_version("adamant") + game("gta5") -author("BPT-Framework") +author("bitpredator") lua54("yes") -description("BPT Progressbar") -version("1.0.0") +version("1.0.1") +description("Progressbar") client_scripts({ "Progress.lua" }) shared_script("@es_extended/imports.lua") diff --git a/server-data/resources/[esx]/esx_progressbar/nui/js/script.js b/server-data/resources/[esx]/esx_progressbar/nui/js/script.js index 98d3eefdf..330fefb33 100644 --- a/server-data/resources/[esx]/esx_progressbar/nui/js/script.js +++ b/server-data/resources/[esx]/esx_progressbar/nui/js/script.js @@ -42,7 +42,7 @@ window.addEventListener("message", function ({ data }) { } } - elems.infoMessage.innerHTML = message + elems.infoMessage.innerHTML = message; elems.notifyInfo.style.display = "block"; const start = new Date(); @@ -66,4 +66,4 @@ window.addEventListener("message", function ({ data }) { clearTimeout(this.timeoutID); timeoutValue = 0; } -}); \ No newline at end of file +}); From 8c661127526da44be24b574b9c44122f0fa1376c Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:40:52 +0100 Subject: [PATCH 13/18] chore: esx_textui updated to version 1.0.1 + Run formatter --- .../resources/[esx]/esx_textui/LICENSE | 4 +- .../resources/[esx]/esx_textui/fxmanifest.lua | 4 +- .../[esx]/esx_textui/nui/css/style.css | 2 + .../resources/[esx]/esx_textui/nui/index.html | 50 ++++++++++--------- .../[esx]/esx_textui/nui/js/script.js | 2 +- .../resources/[esx]/esx_textui/readme.md | 4 +- 6 files changed, 37 insertions(+), 29 deletions(-) diff --git a/server-data/resources/[esx]/esx_textui/LICENSE b/server-data/resources/[esx]/esx_textui/LICENSE index 1e4d06cf3..4f474f077 100644 --- a/server-data/resources/[esx]/esx_textui/LICENSE +++ b/server-data/resources/[esx]/esx_textui/LICENSE @@ -632,7 +632,7 @@ 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. esx_menu_default - Copyright (C) 2015-2022 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi 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 @@ -652,7 +652,7 @@ 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: - esx_menu_default Copyright (C) 2015-2022 Jérémie N'gadi + esx_menu_default Copyright (C) 2015-2024 Jérémie N'gadi 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. diff --git a/server-data/resources/[esx]/esx_textui/fxmanifest.lua b/server-data/resources/[esx]/esx_textui/fxmanifest.lua index 9c4d0c729..9d140ea7a 100644 --- a/server-data/resources/[esx]/esx_textui/fxmanifest.lua +++ b/server-data/resources/[esx]/esx_textui/fxmanifest.lua @@ -1,9 +1,11 @@ fx_version("adamant") + game("gta5") author("ESX-Framework") -version("1.0.0") +version("1.0.1") description("ESX TextUI") lua54("yes") + client_scripts({ "TextUI.lua" }) shared_script("@es_extended/imports.lua") ui_page("nui/index.html") diff --git a/server-data/resources/[esx]/esx_textui/nui/css/style.css b/server-data/resources/[esx]/esx_textui/nui/css/style.css index d8f62c2e8..6febdd38e 100644 --- a/server-data/resources/[esx]/esx_textui/nui/css/style.css +++ b/server-data/resources/[esx]/esx_textui/nui/css/style.css @@ -64,9 +64,11 @@ body { 0% { transform: scaleY(0); } + 80% { transform: scaleY(1.1); } + 100% { transform: scaleY(1); } diff --git a/server-data/resources/[esx]/esx_textui/nui/index.html b/server-data/resources/[esx]/esx_textui/nui/index.html index a41199db2..881b3df68 100644 --- a/server-data/resources/[esx]/esx_textui/nui/index.html +++ b/server-data/resources/[esx]/esx_textui/nui/index.html @@ -1,29 +1,33 @@ - - - - - - - -

-
- info -

-
+ + + + + + + + + +
+
+ info +

-
-
- check_circle -

-
+
+
+
+ check_circle +

-
-
- error -

-
+
+
+
+ error +

- +
+ + \ No newline at end of file diff --git a/server-data/resources/[esx]/esx_textui/nui/js/script.js b/server-data/resources/[esx]/esx_textui/nui/js/script.js index c50478ad9..2b625e7a9 100644 --- a/server-data/resources/[esx]/esx_textui/nui/js/script.js +++ b/server-data/resources/[esx]/esx_textui/nui/js/script.js @@ -80,4 +80,4 @@ notification = (data) => { doc.getElementById(types[data.type]["id"]).style.display = "block"; lastType = types[data.type]["id"]; doc.getElementById(types[data.type]["message"]).innerHTML = data["message"]; -}; \ No newline at end of file +}; diff --git a/server-data/resources/[esx]/esx_textui/readme.md b/server-data/resources/[esx]/esx_textui/readme.md index f5070555d..ae9d5ea4c 100644 --- a/server-data/resources/[esx]/esx_textui/readme.md +++ b/server-data/resources/[esx]/esx_textui/readme.md @@ -1,4 +1,4 @@ -

[ESX] TextUI

Discord - Website - Documentation +

[ESX] TextUI

Discord - Website - Documentation A beautiful and simple Persistent Notification. @@ -43,7 +43,7 @@ ESX.TextUI("i ~r~love~s~ donuts", "error") esx_textui - Persistant Notifications! -Copyright (C) 2022 ESX-Framework +Copyright (C) 2024 ESX-Framework 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. From d799309d328f1c4c92c07afeda974a07a2aec99e Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 19:19:00 +0100 Subject: [PATCH 14/18] chore: Translated the database into the main directory in English --- .../[esx_addons]/esx_dmvschool/esx_dmvschool.sql | 10 +++++----- .../esx_dmvschool/localization/en_esx_dmvschool.sql | 6 ------ 2 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 server-data/resources/[esx_addons]/esx_dmvschool/localization/en_esx_dmvschool.sql diff --git a/server-data/resources/[esx_addons]/esx_dmvschool/esx_dmvschool.sql b/server-data/resources/[esx_addons]/esx_dmvschool/esx_dmvschool.sql index 85257ab9b..26fae51d5 100644 --- a/server-data/resources/[esx_addons]/esx_dmvschool/esx_dmvschool.sql +++ b/server-data/resources/[esx_addons]/esx_dmvschool/esx_dmvschool.sql @@ -1,6 +1,6 @@ INSERT INTO `licenses` (`type`, `label`) VALUES - ('dmv', 'Code de la route'), - ('drive', 'Permis de conduire'), - ('drive_bike', 'Permis moto'), - ('drive_truck', 'Permis camion') -; \ No newline at end of file + ('dmv', 'Driving Permit'), + ('drive', 'Drivers License'), + ('drive_bike', 'Motorcycle License'), + ('drive_truck', 'Commercial Drivers License') +; diff --git a/server-data/resources/[esx_addons]/esx_dmvschool/localization/en_esx_dmvschool.sql b/server-data/resources/[esx_addons]/esx_dmvschool/localization/en_esx_dmvschool.sql deleted file mode 100644 index 26fae51d5..000000000 --- a/server-data/resources/[esx_addons]/esx_dmvschool/localization/en_esx_dmvschool.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO `licenses` (`type`, `label`) VALUES - ('dmv', 'Driving Permit'), - ('drive', 'Drivers License'), - ('drive_bike', 'Motorcycle License'), - ('drive_truck', 'Commercial Drivers License') -; From 39d15a1d595eb1f5bff5c35d72f38d3680b6b840 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 19:37:24 +0100 Subject: [PATCH 15/18] chore: Translated the database into the main directory in English --- ...en_esx_mecanojob.sql => esx_mecanojob.sql} | 0 .../esx_mechanicjob/esx_mechanicjob.sql | 32 -- .../[esx_addons]/esx_taxijob/esx_taxijob.sql | 10 +- .../localization/en_esx_taxijob.sql | 23 -- .../esx_vehicleshop/esx_vehicleshop.sql | 14 +- .../localization/en_esx_vehicleshop.sql | 337 ------------------ 6 files changed, 12 insertions(+), 404 deletions(-) rename server-data/resources/[esx_addons]/esx_mechanicjob/{localization/en_esx_mecanojob.sql => esx_mecanojob.sql} (100%) delete mode 100644 server-data/resources/[esx_addons]/esx_mechanicjob/esx_mechanicjob.sql delete mode 100644 server-data/resources/[esx_addons]/esx_taxijob/localization/en_esx_taxijob.sql delete mode 100644 server-data/resources/[esx_addons]/esx_vehicleshop/localization/en_esx_vehicleshop.sql diff --git a/server-data/resources/[esx_addons]/esx_mechanicjob/localization/en_esx_mecanojob.sql b/server-data/resources/[esx_addons]/esx_mechanicjob/esx_mecanojob.sql similarity index 100% rename from server-data/resources/[esx_addons]/esx_mechanicjob/localization/en_esx_mecanojob.sql rename to server-data/resources/[esx_addons]/esx_mechanicjob/esx_mecanojob.sql diff --git a/server-data/resources/[esx_addons]/esx_mechanicjob/esx_mechanicjob.sql b/server-data/resources/[esx_addons]/esx_mechanicjob/esx_mechanicjob.sql deleted file mode 100644 index e8deb2693..000000000 --- a/server-data/resources/[esx_addons]/esx_mechanicjob/esx_mechanicjob.sql +++ /dev/null @@ -1,32 +0,0 @@ -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_mechanic', 'Mechanic', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_mechanic', 'Mechanic', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_mechanic', 'Mechanic', 1) -; - -INSERT INTO `jobs` (name, label) VALUES - ('mechanic', 'Mechanic') -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('mechanic',0,'recrue','Recrue',12,'{}','{}'), - ('mechanic',1,'novice','Novice',24,'{}','{}'), - ('mechanic',2,'experimente','Experimente',36,'{}','{}'), - ('mechanic',3,'chief',"Chef d\'équipe",48,'{}','{}'), - ('mechanic',4,'boss','Patron',0,'{}','{}') -; - -INSERT INTO `items` (name, label, weight) VALUES - ('gazbottle', 'bouteille de gaz', 2), - ('fixtool', 'outils réparation', 2), - ('carotool', 'outils carosserie', 2), - ('blowpipe', 'Chalumeaux', 2), - ('fixkit', 'Kit réparation', 3), - ('carokit', 'Kit carosserie', 3) -; diff --git a/server-data/resources/[esx_addons]/esx_taxijob/esx_taxijob.sql b/server-data/resources/[esx_addons]/esx_taxijob/esx_taxijob.sql index 927bbf32b..e2e544b67 100644 --- a/server-data/resources/[esx_addons]/esx_taxijob/esx_taxijob.sql +++ b/server-data/resources/[esx_addons]/esx_taxijob/esx_taxijob.sql @@ -15,9 +15,9 @@ INSERT INTO `jobs` (name, label) VALUES ; INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('taxi',0,'recrue','Recrue',12,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',1,'novice','Novice',24,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',2,'experimente','Experimente',36,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',3,'uber','Uber',48,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',4,'boss','Patron',0,'{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}') + ('taxi',0,'recrue','Recruit',12,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + ('taxi',1,'novice','Cabby',24,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + ('taxi',2,'experimente','Experienced',36,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + ('taxi',3,'uber','Uber Cabby',48,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + ('taxi',4,'boss','Lead Cabby',0,'{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}') ; diff --git a/server-data/resources/[esx_addons]/esx_taxijob/localization/en_esx_taxijob.sql b/server-data/resources/[esx_addons]/esx_taxijob/localization/en_esx_taxijob.sql deleted file mode 100644 index e2e544b67..000000000 --- a/server-data/resources/[esx_addons]/esx_taxijob/localization/en_esx_taxijob.sql +++ /dev/null @@ -1,23 +0,0 @@ -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_taxi', 'Taxi', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_taxi', 'Taxi', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_taxi', 'Taxi', 1) -; - -INSERT INTO `jobs` (name, label) VALUES - ('taxi', 'Taxi') -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('taxi',0,'recrue','Recruit',12,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',1,'novice','Cabby',24,'{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',2,'experimente','Experienced',36,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',3,'uber','Uber Cabby',48,'{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - ('taxi',4,'boss','Lead Cabby',0,'{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}') -; diff --git a/server-data/resources/[esx_addons]/esx_vehicleshop/esx_vehicleshop.sql b/server-data/resources/[esx_addons]/esx_vehicleshop/esx_vehicleshop.sql index c88009e42..1413a6a9f 100644 --- a/server-data/resources/[esx_addons]/esx_vehicleshop/esx_vehicleshop.sql +++ b/server-data/resources/[esx_addons]/esx_vehicleshop/esx_vehicleshop.sql @@ -1,20 +1,20 @@ INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_cardealer','Concessionnaire',1) + ('society_cardealer','Cardealer',1) ; INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_cardealer','Concesionnaire',1) + ('society_cardealer','Cardealer',1) ; INSERT INTO `jobs` (name, label) VALUES - ('cardealer','Concessionnaire') + ('cardealer','Cardealer') ; INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('cardealer',0,'recruit','Recrue',10,'{}','{}'), + ('cardealer',0,'recruit','Recruit',10,'{}','{}'), ('cardealer',1,'novice','Novice',25,'{}','{}'), - ('cardealer',2,'experienced','Experimente',40,'{}','{}'), - ('cardealer',3,'boss','Patron',0,'{}','{}') + ('cardealer',2,'experienced','Experienced',40,'{}','{}'), + ('cardealer',3,'boss','Boss',0,'{}','{}') ; CREATE TABLE `cardealer_vehicles` ( @@ -71,7 +71,7 @@ CREATE TABLE `vehicle_categories` ( INSERT INTO `vehicle_categories` (name, label) VALUES ('compacts','Compacts'), - ('coupes','Coupés'), + ('coupes','Coupes'), ('sedans','Sedans'), ('sports','Sports'), ('sportsclassics','Sports Classics'), diff --git a/server-data/resources/[esx_addons]/esx_vehicleshop/localization/en_esx_vehicleshop.sql b/server-data/resources/[esx_addons]/esx_vehicleshop/localization/en_esx_vehicleshop.sql deleted file mode 100644 index 1413a6a9f..000000000 --- a/server-data/resources/[esx_addons]/esx_vehicleshop/localization/en_esx_vehicleshop.sql +++ /dev/null @@ -1,337 +0,0 @@ -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_cardealer','Cardealer',1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_cardealer','Cardealer',1) -; - -INSERT INTO `jobs` (name, label) VALUES - ('cardealer','Cardealer') -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('cardealer',0,'recruit','Recruit',10,'{}','{}'), - ('cardealer',1,'novice','Novice',25,'{}','{}'), - ('cardealer',2,'experienced','Experienced',40,'{}','{}'), - ('cardealer',3,'boss','Boss',0,'{}','{}') -; - -CREATE TABLE `cardealer_vehicles` ( - `id` int NOT NULL AUTO_INCREMENT, - `vehicle` varchar(255) NOT NULL, - `price` int NOT NULL, - - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -CREATE TABLE `vehicle_sold` ( - `client` VARCHAR(50) NOT NULL, - `model` VARCHAR(50) NOT NULL, - `plate` VARCHAR(50) NOT NULL, - `soldby` VARCHAR(50) NOT NULL, - `date` VARCHAR(50) NOT NULL, - - PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -CREATE TABLE `owned_vehicles` ( - `owner` VARCHAR(60) NOT NULL, - `plate` varchar(12) NOT NULL, - `vehicle` longtext, - `type` VARCHAR(20) NOT NULL DEFAULT 'car', - `job` VARCHAR(20) NULL DEFAULT NULL, - `stored` TINYINT(1) NOT NULL DEFAULT '0', - - PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -CREATE TABLE `rented_vehicles` ( - `vehicle` varchar(60) NOT NULL, - `plate` varchar(12) NOT NULL, - `player_name` varchar(255) NOT NULL, - `base_price` int NOT NULL, - `rent_price` int NOT NULL, - `owner` VARCHAR(60) NOT NULL, - - PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -CREATE TABLE `vehicle_categories` ( - `name` varchar(60) NOT NULL, - `label` varchar(60) NOT NULL, - - PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -INSERT INTO `vehicle_categories` (name, label) VALUES - ('compacts','Compacts'), - ('coupes','Coupes'), - ('sedans','Sedans'), - ('sports','Sports'), - ('sportsclassics','Sports Classics'), - ('super','Super'), - ('muscle','Muscle'), - ('offroad','Off Road'), - ('suvs','SUVs'), - ('vans','Vans'), - ('motorcycles','Motos') -; - -CREATE TABLE `vehicles` ( - `name` varchar(60) NOT NULL, - `model` varchar(60) NOT NULL, - `price` int NOT NULL, - `category` varchar(60) DEFAULT NULL, - - PRIMARY KEY (`model`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -INSERT INTO `vehicles` (name, model, price, category) VALUES - ('Blade','blade',15000,'muscle'), - ('Buccaneer','buccaneer',18000,'muscle'), - ('Buccaneer Rider','buccaneer2',24000,'muscle'), - ('Chino','chino',15000,'muscle'), - ('Chino Luxe','chino2',19000,'muscle'), - ('Coquette BlackFin','coquette3',55000,'muscle'), - ('Dominator','dominator',35000,'muscle'), - ('Dukes','dukes',28000,'muscle'), - ('Gauntlet','gauntlet',30000,'muscle'), - ('Hotknife','hotknife',125000,'muscle'), - ('Faction','faction',20000,'muscle'), - ('Faction Rider','faction2',30000,'muscle'), - ('Faction XL','faction3',40000,'muscle'), - ('Nightshade','nightshade',65000,'muscle'), - ('Phoenix','phoenix',12500,'muscle'), - ('Picador','picador',18000,'muscle'), - ('Sabre Turbo','sabregt',20000,'muscle'), - ('Sabre GT','sabregt2',25000,'muscle'), - ('Slam Van','slamvan3',11500,'muscle'), - ('Tampa','tampa',16000,'muscle'), - ('Virgo','virgo',14000,'muscle'), - ('Vigero','vigero',12500,'muscle'), - ('Voodoo','voodoo',7200,'muscle'), - ('Blista','blista',8000,'compacts'), - ('Brioso R/A','brioso',18000,'compacts'), - ('Issi','issi2',10000,'compacts'), - ('Panto','panto',10000,'compacts'), - ('Prairie','prairie',12000,'compacts'), - ('Bison','bison',45000,'vans'), - ('Bobcat XL','bobcatxl',32000,'vans'), - ('Burrito','burrito3',19000,'vans'), - ('Burrito','gburrito2',29000,'vans'), - ('Camper','camper',42000,'vans'), - ('Gang Burrito','gburrito',45000,'vans'), - ('Journey','journey',6500,'vans'), - ('Minivan','minivan',13000,'vans'), - ('Moonbeam','moonbeam',18000,'vans'), - ('Moonbeam Rider','moonbeam2',35000,'vans'), - ('Paradise','paradise',19000,'vans'), - ('Rumpo','rumpo',15000,'vans'), - ('Rumpo Trail','rumpo3',19500,'vans'), - ('Surfer','surfer',12000,'vans'), - ('Youga','youga',10800,'vans'), - ('Youga Luxuary','youga2',14500,'vans'), - ('Asea','asea',5500,'sedans'), - ('Cognoscenti','cognoscenti',55000,'sedans'), - ('Emperor','emperor',8500,'sedans'), - ('Fugitive','fugitive',12000,'sedans'), - ('Glendale','glendale',6500,'sedans'), - ('Intruder','intruder',7500,'sedans'), - ('Premier','premier',8000,'sedans'), - ('Primo Custom','primo2',14000,'sedans'), - ('Regina','regina',5000,'sedans'), - ('Schafter','schafter2',25000,'sedans'), - ('Stretch','stretch',90000,'sedans'), - ('Super Diamond','superd',130000,'sedans'), - ('Tailgater','tailgater',30000,'sedans'), - ('Warrener','warrener',4000,'sedans'), - ('Washington','washington',9000,'sedans'), - ('Baller','baller2',40000,'suvs'), - ('Baller Sport','baller3',60000,'suvs'), - ('Cavalcade','cavalcade2',55000,'suvs'), - ('Contender','contender',70000,'suvs'), - ('Dubsta','dubsta',45000,'suvs'), - ('Dubsta Luxuary','dubsta2',60000,'suvs'), - ('Fhantom','fq2',17000,'suvs'), - ('Grabger','granger',50000,'suvs'), - ('Gresley','gresley',47500,'suvs'), - ('Huntley S','huntley',40000,'suvs'), - ('Landstalker','landstalker',35000,'suvs'), - ('Mesa','mesa',16000,'suvs'), - ('Mesa Trail','mesa3',40000,'suvs'), - ('Patriot','patriot',55000,'suvs'), - ('Radius','radi',29000,'suvs'), - ('Rocoto','rocoto',45000,'suvs'), - ('Seminole','seminole',25000,'suvs'), - ('XLS','xls',32000,'suvs'), - ('Btype','btype',62000,'sportsclassics'), - ('Btype Luxe','btype3',85000,'sportsclassics'), - ('Btype Hotroad','btype2',155000,'sportsclassics'), - ('Casco','casco',30000,'sportsclassics'), - ('Coquette Classic','coquette2',40000,'sportsclassics'), - ('Manana','manana',12800,'sportsclassics'), - ('Monroe','monroe',55000,'sportsclassics'), - ('Pigalle','pigalle',20000,'sportsclassics'), - ('Stinger','stinger',80000,'sportsclassics'), - ('Stinger GT','stingergt',75000,'sportsclassics'), - ('Stirling GT','feltzer3',65000,'sportsclassics'), - ('Z-Type','ztype',220000,'sportsclassics'), - ('Bifta','bifta',12000,'offroad'), - ('Bf Injection','bfinjection',16000,'offroad'), - ('Blazer','blazer',6500,'offroad'), - ('Blazer Sport','blazer4',8500,'offroad'), - ('Brawler','brawler',45000,'offroad'), - ('Bubsta 6x6','dubsta3',120000,'offroad'), - ('Dune Buggy','dune',8000,'offroad'), - ('Guardian','guardian',45000,'offroad'), - ('Rebel','rebel2',35000,'offroad'), - ('Sandking','sandking',55000,'offroad'), - ('The Liberator','monster',210000,'offroad'), - ('Trophy Truck','trophytruck',60000,'offroad'), - ('Trophy Truck Limited','trophytruck2',80000,'offroad'), - ('Cognoscenti Cabrio','cogcabrio',55000,'coupes'), - ('Exemplar','exemplar',32000,'coupes'), - ('F620','f620',40000,'coupes'), - ('Felon','felon',42000,'coupes'), - ('Felon GT','felon2',55000,'coupes'), - ('Jackal','jackal',38000,'coupes'), - ('Oracle XS','oracle2',35000,'coupes'), - ('Sentinel','sentinel',32000,'coupes'), - ('Sentinel XS','sentinel2',40000,'coupes'), - ('Windsor','windsor',95000,'coupes'), - ('Windsor Drop','windsor2',125000,'coupes'), - ('Zion','zion',36000,'coupes'), - ('Zion Cabrio','zion2',45000,'coupes'), - ('9F','ninef',65000,'sports'), - ('9F Cabrio','ninef2',80000,'sports'), - ('Alpha','alpha',60000,'sports'), - ('Banshee','banshee',70000,'sports'), - ('Bestia GTS','bestiagts',55000,'sports'), - ('Buffalo','buffalo',12000,'sports'), - ('Buffalo S','buffalo2',20000,'sports'), - ('Carbonizzare','carbonizzare',75000,'sports'), - ('Comet','comet2',65000,'sports'), - ('Coquette','coquette',65000,'sports'), - ('Drift Tampa','tampa2',80000,'sports'), - ('Elegy','elegy2',38500,'sports'), - ('Feltzer','feltzer2',55000,'sports'), - ('Furore GT','furoregt',45000,'sports'), - ('Fusilade','fusilade',40000,'sports'), - ('Jester','jester',65000,'sports'), - ('Jester(Racecar)','jester2',135000,'sports'), - ('Khamelion','khamelion',38000,'sports'), - ('Kuruma','kuruma',30000,'sports'), - ('Lynx','lynx',40000,'sports'), - ('Mamba','mamba',70000,'sports'), - ('Massacro','massacro',65000,'sports'), - ('Massacro(Racecar)','massacro2',130000,'sports'), - ('Omnis','omnis',35000,'sports'), - ('Penumbra','penumbra',28000,'sports'), - ('Rapid GT','rapidgt',35000,'sports'), - ('Rapid GT Convertible','rapidgt2',45000,'sports'), - ('Schafter V12','schafter3',50000,'sports'), - ('Seven 70','seven70',39500,'sports'), - ('Sultan','sultan',15000,'sports'), - ('Surano','surano',50000,'sports'), - ('Tropos','tropos',40000,'sports'), - ('Verlierer','verlierer2',70000,'sports'), - ('Adder','adder',900000,'super'), - ('Banshee 900R','banshee2',255000,'super'), - ('Bullet','bullet',90000,'super'), - ('Cheetah','cheetah',375000,'super'), - ('Entity XF','entityxf',425000,'super'), - ('ETR1','sheava',220000,'super'), - ('FMJ','fmj',185000,'super'), - ('Infernus','infernus',180000,'super'), - ('Osiris','osiris',160000,'super'), - ('Pfister','pfister811',85000,'super'), - ('RE-7B','le7b',325000,'super'), - ('Reaper','reaper',150000,'super'), - ('Sultan RS','sultanrs',65000,'super'), - ('T20','t20',300000,'super'), - ('Turismo R','turismor',350000,'super'), - ('Tyrus','tyrus',600000,'super'), - ('Vacca','vacca',120000,'super'), - ('Voltic','voltic',90000,'super'), - ('X80 Proto','prototipo',2500000,'super'), - ('Zentorno','zentorno',1500000,'super'), - ('Akuma','AKUMA',7500,'motorcycles'), - ('Avarus','avarus',18000,'motorcycles'), - ('Bagger','bagger',13500,'motorcycles'), - ('Bati 801','bati',12000,'motorcycles'), - ('Bati 801RR','bati2',19000,'motorcycles'), - ('BF400','bf400',6500,'motorcycles'), - ('BMX (velo)','bmx',160,'motorcycles'), - ('Carbon RS','carbonrs',18000,'motorcycles'), - ('Chimera','chimera',38000,'motorcycles'), - ('Cliffhanger','cliffhanger',9500,'motorcycles'), - ('Cruiser (velo)','cruiser',510,'motorcycles'), - ('Daemon','daemon',11500,'motorcycles'), - ('Daemon High','daemon2',13500,'motorcycles'), - ('Defiler','defiler',9800,'motorcycles'), - ('Double T','double',28000,'motorcycles'), - ('Enduro','enduro',5500,'motorcycles'), - ('Esskey','esskey',4200,'motorcycles'), - ('Faggio','faggio',1900,'motorcycles'), - ('Vespa','faggio2',2800,'motorcycles'), - ('Fixter (velo)','fixter',225,'motorcycles'), - ('Gargoyle','gargoyle',16500,'motorcycles'), - ('Hakuchou','hakuchou',31000,'motorcycles'), - ('Hakuchou Sport','hakuchou2',55000,'motorcycles'), - ('Hexer','hexer',12000,'motorcycles'), - ('Innovation','innovation',23500,'motorcycles'), - ('Manchez','manchez',5300,'motorcycles'), - ('Nemesis','nemesis',5800,'motorcycles'), - ('Nightblade','nightblade',35000,'motorcycles'), - ('PCJ-600','pcj',6200,'motorcycles'), - ('Ruffian','ruffian',6800,'motorcycles'), - ('Sanchez','sanchez',5300,'motorcycles'), - ('Sanchez Sport','sanchez2',5300,'motorcycles'), - ('Sanctus','sanctus',25000,'motorcycles'), - ('Scorcher (velo)','scorcher',280,'motorcycles'), - ('Sovereign','sovereign',22000,'motorcycles'), - ('Shotaro Concept','shotaro',320000,'motorcycles'), - ('Thrust','thrust',24000,'motorcycles'), - ('Tri bike (velo)','tribike3',520,'motorcycles'), - ('Vader','vader',7200,'motorcycles'), - ('Vortex','vortex',9800,'motorcycles'), - ('Woflsbane','wolfsbane',9000,'motorcycles'), - ('Zombie','zombiea',9500,'motorcycles'), - ('Zombie Luxuary','zombieb',12000,'motorcycles'), - ('blazer5', 'blazer5', 1755600, 'offroad'), - ('Ruiner 2', 'ruiner2', 5745600, 'muscle'), - ('Voltic 2', 'voltic2', 3830400, 'super'), - ('Ardent', 'ardent', 1150000, 'sportsclassics'), - ('Oppressor', 'oppressor', 3524500, 'super'), - ('Visione', 'visione', 2250000, 'super'), - ('Retinue', 'retinue', 615000, 'sportsclassics'), - ('Cyclone', 'cyclone', 1890000, 'super'), - ('Rapid GT3', 'rapidgt3', 885000, 'sportsclassics'), - ('raiden', 'raiden', 1375000, 'sports'), - ('Yosemite', 'yosemite', 485000, 'muscle'), - ('Deluxo', 'deluxo', 4721500, 'sportsclassics'), - ('Pariah', 'pariah', 1420000, 'sports'), - ('Stromberg', 'stromberg', 3185350, 'sports'), - ('SC 1', 'sc1', 1603000, 'super'), - ('riata', 'riata', 380000, 'offroad'), - ('Hermes', 'hermes', 535000, 'muscle'), - ('Savestra', 'savestra', 990000, 'sportsclassics'), - ('Streiter', 'streiter', 500000, 'sports'), - ('Kamacho', 'kamacho', 345000, 'offroad'), - ('GT 500', 'gt500', 785000, 'sportsclassics'), - ('Z190', 'z190', 900000, 'sportsclassics'), - ('Viseris', 'viseris', 875000, 'sportsclassics'), - ('Autarch', 'autarch', 1955000, 'super'), - ('Comet 5', 'comet5', 1145000, 'sports'), - ('Neon', 'neon', 1500000, 'sports'), - ('Revolter', 'revolter', 1610000, 'sports'), - ('Sentinel3', 'sentinel3', 650000, 'sports'), - ('Hustler', 'hustler', 625000, 'muscle') -; From 4bda410dd6af6caa2dc643706998062e2884ea6e Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 20:07:34 +0100 Subject: [PATCH 16/18] chore: update ox_inventory version 2.38.1 --- .../resources/[ox]/ox_inventory/LICENSE | 5 +- .../resources/[ox]/ox_inventory/README.md | 48 +- .../resources/[ox]/ox_inventory/client.lua | 531 +++--- .../[ox]/ox_inventory/data/animations.lua | 8 +- .../[ox]/ox_inventory/data/crafting.lua | 34 + .../[ox]/ox_inventory/data/evidence.lua | 10 +- .../[ox]/ox_inventory/data/items.lua | 135 +- .../[ox]/ox_inventory/data/vehicles.lua | 85 +- .../[ox]/ox_inventory/data/weapons.lua | 1454 +++++++++-------- .../[ox]/ox_inventory/fxmanifest.lua | 81 +- .../resources/[ox]/ox_inventory/init.lua | 272 ++- .../[ox]/ox_inventory/locales/ar.json | 2 +- .../[ox]/ox_inventory/locales/cs.json | 6 +- .../[ox]/ox_inventory/locales/da.json | 2 +- .../[ox]/ox_inventory/locales/de.json | 11 +- .../[ox]/ox_inventory/locales/el.json | 2 +- .../[ox]/ox_inventory/locales/en.json | 8 +- .../[ox]/ox_inventory/locales/es.json | 5 +- .../[ox]/ox_inventory/locales/et.json | 2 +- .../[ox]/ox_inventory/locales/fi.json | 5 +- .../[ox]/ox_inventory/locales/fr.json | 5 +- .../[ox]/ox_inventory/locales/hr.json | 2 +- .../[ox]/ox_inventory/locales/hu.json | 9 +- .../[ox]/ox_inventory/locales/id.json | 4 +- .../[ox]/ox_inventory/locales/it.json | 4 +- .../[ox]/ox_inventory/locales/lt.json | 3 + .../[ox]/ox_inventory/locales/nl.json | 3 + .../[ox]/ox_inventory/locales/no.json | 5 +- .../[ox]/ox_inventory/locales/pl.json | 3 + .../[ox]/ox_inventory/locales/sr.json | 3 + .../[ox]/ox_inventory/locales/tr.json | 22 +- .../[ox]/ox_inventory/locales/zh-cn.json | 74 +- .../[ox]/ox_inventory/locales/zh-tw.json | 6 +- .../ox_inventory/modules/bridge/client.lua | 45 +- .../modules/bridge/esx/client.lua | 36 +- .../modules/bridge/esx/server.lua | 31 +- .../ox_inventory/modules/bridge/nd/client.lua | 64 +- .../ox_inventory/modules/bridge/nd/server.lua | 161 +- .../ox_inventory/modules/bridge/ox/client.lua | 10 +- .../ox_inventory/modules/bridge/ox/server.lua | 31 +- .../ox_inventory/modules/bridge/qb/client.lua | 70 +- .../ox_inventory/modules/bridge/qb/server.lua | 46 +- .../ox_inventory/modules/bridge/server.lua | 38 +- .../ox_inventory/modules/crafting/client.lua | 101 ++ .../ox_inventory/modules/crafting/server.lua | 230 +++ .../ox_inventory/modules/hooks/server.lua | 86 +- .../ox_inventory/modules/interface/client.lua | 12 +- .../ox_inventory/modules/inventory/client.lua | 192 ++- .../ox_inventory/modules/inventory/server.lua | 927 ++++++----- .../ox_inventory/modules/items/client.lua | 34 +- .../ox_inventory/modules/items/containers.lua | 20 +- .../ox_inventory/modules/items/server.lua | 70 +- .../ox_inventory/modules/items/shared.lua | 64 +- .../ox_inventory/modules/mysql/server.lua | 319 ++-- .../ox_inventory/modules/pefcl/server.lua | 31 +- .../ox_inventory/modules/shops/client.lua | 95 +- .../ox_inventory/modules/shops/server.lua | 62 +- .../ox_inventory/modules/utils/client.lua | 126 +- .../ox_inventory/modules/utils/server.lua | 57 +- .../ox_inventory/modules/weapon/client.lua | 84 +- .../resources/[ox]/ox_inventory/server.lua | 75 +- .../[ox]/ox_inventory/setup/convert.lua | 9 +- .../[ox]/ox_inventory/web/build/LICENSE | 18 + .../web/build/assets/index-95f8e076.css | 427 ----- .../web/build/assets/index-9aba2ab3.css | 1 + .../web/build/assets/index-9fceb909.js | 894 ---------- .../web/build/assets/index-e31759b5.js | 40 + .../[ox]/ox_inventory/web/build/index.html | 33 +- 68 files changed, 3463 insertions(+), 3925 deletions(-) create mode 100644 server-data/resources/[ox]/ox_inventory/data/crafting.lua create mode 100644 server-data/resources/[ox]/ox_inventory/modules/crafting/client.lua create mode 100644 server-data/resources/[ox]/ox_inventory/modules/crafting/server.lua create mode 100644 server-data/resources/[ox]/ox_inventory/web/build/LICENSE delete mode 100644 server-data/resources/[ox]/ox_inventory/web/build/assets/index-95f8e076.css create mode 100644 server-data/resources/[ox]/ox_inventory/web/build/assets/index-9aba2ab3.css delete mode 100644 server-data/resources/[ox]/ox_inventory/web/build/assets/index-9fceb909.js create mode 100644 server-data/resources/[ox]/ox_inventory/web/build/assets/index-e31759b5.js diff --git a/server-data/resources/[ox]/ox_inventory/LICENSE b/server-data/resources/[ox]/ox_inventory/LICENSE index effa1075a..dc617bf2d 100644 --- a/server-data/resources/[ox]/ox_inventory/LICENSE +++ b/server-data/resources/[ox]/ox_inventory/LICENSE @@ -632,7 +632,10 @@ 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. Ox Inventory - Copyright (C) 2021 Linden , Dunak , Luke + Copyright © 2023 Overextended (https://github.com/overextended) + Linden (https://github.com/thelindat) + Luke (https://github.com/LukeWasTakenn) + Dunak (https://github.com/dunak-debug) 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 diff --git a/server-data/resources/[ox]/ox_inventory/README.md b/server-data/resources/[ox]/ox_inventory/README.md index 173245383..5232f70e9 100644 --- a/server-data/resources/[ox]/ox_inventory/README.md +++ b/server-data/resources/[ox]/ox_inventory/README.md @@ -1,30 +1,33 @@ -

- + -# Framework +## Config -The inventory was designed with the intention to move towards a more generic / standalone structure so it can be integrated into any framework without too much hassle. I will be writing a guide for manually setting up support _sometime soon™_. In the mean-time, it will work without any alterations if using the latest updates to **[ESX Legacy](https://github.com/esx-framework/esx-legacy)**. +Resource configuration is handled using convars. Refer to the documentation for more information. -Experimental support for [qb-core](https://github.com/qbcore-framework/qb-core) has been added, but requires a recent installation. Do not expect 100% compatibility or support. +## Framework -# Config +The inventory was designed with limited reliability on frameworks, preferring frameworks _designed to use ox_inventory_. A framework is still necessary for handling certain features such as -Refer to the [documentation](https://overextended.github.io/docs/ox_inventory/) setting your config. -When set, you can add the following to your 'server.cfg' +- Loading player inventories. +- Owned vehicles. +- Licenses. +- Group/job systems. -``` -exec @ox_inventory/config.cfg -ensure ox_inventory -``` +Compatibility for frameworks is handled in the "bridge" module, and by default includes -# Logging +- [ox_core](https://github.com/overextended/ox_core) +- [es_extended](https://github.com/esx-framework/esx_core) +- [qbx-core](https://github.com/Qbox-project/qbx_core) or [qb-core](https://github.com/qbcore-framework/qb-core) +- [nd_core](https://github.com/ND-Framework/ND_Core) -The included logging module utilises datadog to store logging data, which can be expanded for improved analytics and metrics. Register an account at [datadoghq](https://www.datadoghq.com/). -The _free plan_ is enough for most user's purposes and provides far more utility than the typical weird discord logs utilised in other resources. +Do not expect 100% compatibility or support for third party frameworks. -Once you have registered, generate an API key and add `set datadog:key 'apikey'` to your server config. +## Features -# Features +## Logging + +Logging is built-in using ox_lib's [logger](https://overextended.dev/ox_lib/Modules/Logger/Server#liblogger) module, using Datadog or Grafana Loki. Discord is not and will not be supported. ### Shops @@ -57,11 +60,18 @@ Once you have registered, generate an API key and add `set datadog:key 'apikey'`

- +

Legal Notices

License

Ox Inventory -Copyright © 2022 [Linden](https://github.com/thelindat), [Dunak](https://github.com/dunak-debug), [Luke](https://github.com/LukeWasTakenn) + +Copyright © 2023 Overextended (https://github.com/overextended) + +Linden (https://github.com/thelindat) + +Luke (https://github.com/LukeWasTakenn) + +Dunak (https://github.com/dunak-debug) 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 diff --git a/server-data/resources/[ox]/ox_inventory/client.lua b/server-data/resources/[ox]/ox_inventory/client.lua index 30f122a99..a1f161212 100644 --- a/server-data/resources/[ox]/ox_inventory/client.lua +++ b/server-data/resources/[ox]/ox_inventory/client.lua @@ -41,16 +41,28 @@ end) plyState:set('invBusy', true, false) plyState:set('invHotkeys', false, false) +plyState:set('canUseWeapons', false, false) local function canOpenInventory() - return PlayerData.loaded - and not invBusy - and not PlayerData.dead - and invOpen ~= nil - and (not currentWeapon or currentWeapon.timer == 0) - and not IsPedCuffed(playerPed) - and not IsPauseMenuActive() - and not IsPedFatallyInjured(playerPed) + if not PlayerData.loaded then + return shared.info('cannot open inventory', '(is not loaded)') + end + + if IsPauseMenuActive() then return end + + if invBusy or invOpen == nil or (currentWeapon and currentWeapon.timer ~= 0) then + return shared.info('cannot open inventory', '(is busy)') + end + + if PlayerData.dead or IsPedFatallyInjured(playerPed) then + return shared.info('cannot open inventory', '(fatal injury)') + end + + if PlayerData.cuffed or IsPedCuffed(playerPed) then + return shared.info('cannot open inventory', '(cuffed)') + end + + return true end ---@param ped number @@ -97,6 +109,10 @@ local function closeTrunk() end end +local CraftingBenches = require 'modules.crafting.client' +local Vehicles = lib.load('data.vehicles') +local Inventory = require 'modules.inventory.client' + ---@param inv string? ---@param data any? ---@return boolean? @@ -125,12 +141,14 @@ function client.openInventory(inv, data) end end elseif IsNuiFocused() then - -- If triggering event from another nui such as qtarget, may need to wait for focus to end + -- If triggering from another nui, may need to wait for focus to end. Wait(100) - if IsNuiFocused() then - warn('other scripts have nui focus and may cause issues (e.g. disable focus, prevent input, overlap inventory window)') - end + -- People still complain about this being an "error" and ask "how fix" despite being a warning + -- for people with above room-temperature iqs to look into resource conflicts on their own. + -- if IsNuiFocused() then + -- warn('other scripts have nui focus and may cause issues (e.g. disable focus, prevent input, overlap inventory window)') + -- end end if inv == 'dumpster' and cache.vehicle then @@ -140,7 +158,7 @@ function client.openInventory(inv, data) if canOpenInventory() then local left, right - if inv == 'player' then + if inv == 'player' and data ~= cache.serverId then local targetId, targetPed if not data then @@ -168,22 +186,50 @@ function client.openInventory(inv, data) end left, right = lib.callback.await('ox_inventory:openShop', 200, data) + elseif inv == 'crafting' then + if cache.vehicle then + return lib.notify({ id = 'cannot_perform', type = 'error', description = locale('cannot_perform') }) + end - elseif invOpen ~= nil then - if inv == 'policeevidence' then - local input = lib.inputDialog(locale('police_evidence'), {locale('locker_number')}) --[[@as any]] + left = lib.callback.await('ox_inventory:openCraftingBench', 200, data.id, data.index) - if input then - input = tonumber(input[1]) - else - return lib.notify({ description = locale('locker_no_value'), type = 'error' }) - end + if left then + right = CraftingBenches[data.id] + + if not right?.items then return end + + local coords, distance - if type(input) ~= 'number' then - return lib.notify({ description = locale('locker_must_number'), type = 'error' }) + if not right.zones and not right.points then + coords = GetEntityCoords(cache.ped) + distance = 2 else - data = input + coords = shared.target and right.zones and right.zones[data.index].coords or right.points and right.points[data.index] + distance = coords and shared.target and right.zones[data.index].distance or 2 end + + right = { + type = 'crafting', + id = data.id, + label = right.label or locale('crafting_bench'), + index = data.index, + slots = right.slots, + items = right.items, + coords = coords, + distance = distance + } + end + elseif invOpen ~= nil then + if inv == 'policeevidence' then + if not data then + local input = lib.inputDialog(locale('police_evidence'), { + { label = locale('locker_number'), type = 'number', required = true, icon = 'calculator' } + }) --[[@as number[]? ]] + + if not input then return end + + data = input[1] + end end left, right = lib.callback.await('ox_inventory:openInventory', false, inv, data) @@ -223,6 +269,29 @@ function client.openInventory(inv, data) currentInventory.coords = GetEntityCoords(playerPed) end + if inv == 'trunk' then + SetTimeout(200, function() + ---@todo animation for vans? + Utils.PlayAnim(0, 'anim@heists@prison_heiststation@cop_reactions', 'cop_b_idle', 3.0, 3.0, -1, 49, 0.0, 0, 0, 0) + + local entity = data.entity or NetworkGetEntityFromNetworkId(data.netid) + currentInventory.entity = entity + currentInventory.door = data.door + + if not currentInventory.door then + local vehicleHash = GetEntityModel(entity) + local vehicleClass = GetVehicleClass(entity) + currentInventory.door = vehicleClass == 12 and { 2, 3 } or Vehicles.Storage[vehicleHash] and 4 or 5 + end + + while currentInventory?.entity == entity and invOpen and DoesEntityExist(entity) and Inventory.CanAccessTrunk(entity) do + Wait(100) + end + + if invOpen then client.closeInventory() end + end) + end + -- Stash exists (useful for custom stashes) return true else @@ -231,7 +300,7 @@ function client.openInventory(inv, data) if invOpen == false then lib.notify({ id = 'inventory_right_access', type = 'error', description = locale('inventory_right_access') }) end if invOpen then client.closeInventory() end end - elseif invBusy then lib.notify({ id = 'inventory_player_access', type = 'error', description = locale('inventory_player_access') }) end + else lib.notify({ id = 'inventory_player_access', type = 'error', description = locale('inventory_player_access') }) end end RegisterNetEvent('ox_inventory:openInventory', client.openInventory) @@ -263,17 +332,18 @@ RegisterNetEvent('ox_inventory:forceOpenInventory', function(left, right) }) end) -local Animations = data 'animations' +local Animations = lib.load('data.animations') local Items = require 'modules.items.client' +local usingItem = false +---@param data { name: string, label: string, count: number, slot: number, metadata: table, weight: number } lib.callback.register('ox_inventory:usingItem', function(data) local item = Items[data.name] - if item and invBusy then + if item and usingItem then if not item.client then return true end ---@cast item +OxClientProps item = item.client - plyState.invBusy = true if type(item.anim) == 'string' then item.anim = Animations.anim[item.anim] @@ -331,7 +401,8 @@ end) local function canUseItem(isAmmo) local ped = cache.ped - return (not isAmmo or currentWeapon) + return not usingItem + and (not isAmmo or currentWeapon) and PlayerData.loaded and not PlayerData.dead and not invBusy @@ -341,36 +412,40 @@ local function canUseItem(isAmmo) end ---@param data table ----@param cb function? +---@param cb fun(response: SlotWithItem | false)? local function useItem(data, cb) - if invOpen and data.close then client.closeInventory() end local slotData, result = PlayerData.inventory[data.slot] - if canUseItem(data.ammo and true) then - if currentWeapon and currentWeapon?.timer > 100 then return end + if not slotData or not canUseItem(data.ammo and true) then return end - plyState.invBusy = true - result = lib.callback.await('ox_inventory:useItem', 200, data.name, data.slot, slotData.metadata) + if currentWeapon?.timer and currentWeapon.timer > 100 then return end - if not result then - Wait(500) - plyState.invBusy = false - return - end - end + if invOpen and data.close then client.closeInventory() end + + usingItem = true + ---@type boolean? + result = lib.callback.await('ox_inventory:useItem', 200, data.name, data.slot, slotData.metadata) - if cb then + if result and cb then local success, response = pcall(cb, result and slotData) if not success and response then - print(('^1An error occurred while calling item "%s" callback!\n^1SCRIPT ERROR: %s^0'):format(slotData.name, response)) + warn(('^1An error occurred while calling item "%s" callback!\n^1SCRIPT ERROR: %s^0'):format(slotData.name, response)) end end + if result then + TriggerEvent('ox_inventory:usedItem', slotData.name, slotData.slot, next(slotData.metadata) and slotData.metadata) + end + Wait(500) - plyState.invBusy = false + usingItem = false end +AddEventHandler('ox_inventory:usedItem', function(name, slot, metadata) + TriggerServerEvent('ox_inventory:usedItemInternal', slot) +end) + AddEventHandler('ox_inventory:item', useItem) exports('useItem', useItem) @@ -420,7 +495,7 @@ local function useSlot(slot) if data.effect then data:effect({name = item.name, slot = item.slot, metadata = item.metadata}) elseif data.weapon then - if EnableWeaponWheel then return end + if EnableWeaponWheel or not plyState.canUseWeapons then return end if IsCinematicCamRendering() then SetCinematicModeActive(false) end @@ -431,11 +506,21 @@ local function useSlot(slot) if weaponSlot == data.slot then return end end + GiveWeaponToPed(playerPed, data.hash, 0, false, true) + SetCurrentPedWeapon(playerPed, data.hash, false) + + if data.hash ~= GetSelectedPedWeapon(playerPed) then + return lib.notify({ type = 'error', description = locale('cannot_use', data.label) }) + end + + RemoveWeaponFromPed(cache.ped, data.hash) + useItem(data, function(result) if result then - currentWeapon = Weapon.Equip(item, data) + local sleep + currentWeapon, sleep = Weapon.Equip(item, data) - if client.weaponanims then Wait(500) end + if sleep then Wait(sleep) end end end) elseif currentWeapon then @@ -526,6 +611,9 @@ local function useSlot(slot) end) elseif data.component then local components = data.client.component + + if not components then return end + local componentType = data.type local weaponComponents = PlayerData.inventory[currentWeapon.slot].metadata.components @@ -549,6 +637,7 @@ local function useSlot(slot) if success then GiveWeaponComponentToPed(playerPed, currentWeapon.hash, component) + TriggerEvent('ox_inventory:updateWeaponComponent', 'added', component, data.name) end end end) @@ -589,8 +678,6 @@ exports('openNearbyInventory', openNearbyInventory) local currentInstance local playerCoords -local table = lib.table -local Inventory = require 'modules.inventory.client' local Shops = require 'modules.shops.client' ---@todo remove or replace when the bridge module gets restructured @@ -618,15 +705,13 @@ local invHotkeys = false local function registerCommands() RegisterCommand('steal', openNearbyInventory, false) - local Vehicles = data 'vehicles' - local function openGlovebox(vehicle) if not IsPedInAnyVehicle(playerPed, false) or not NetworkGetEntityIsNetworked(vehicle) then return end local vehicleHash = GetEntityModel(vehicle) local vehicleClass = GetVehicleClass(vehicle) local checkVehicle = Vehicles.Storage[vehicleHash] - + -- No storage or no glovebox if (checkVehicle == 0 or checkVehicle == 2) or (not Vehicles.glovebox[vehicleClass] and not Vehicles.glovebox.models[vehicleHash]) then return end @@ -637,7 +722,7 @@ local function registerCommands() end end - lib.addKeybind({ + local primary = lib.addKeybind({ name = 'inv', description = locale('open_player_inventory'), defaultKey = client.keys[1], @@ -668,16 +753,16 @@ local function registerCommands() name = 'inv2', description = locale('open_secondary_inventory'), defaultKey = client.keys[2], - onPressed = function() + onPressed = function(self) + if primary:getCurrentKey() == self:getCurrentKey() then + return warn(("secondary inventory keybind '%s' disabled (keybind cannot match primary inventory keybind)"):format(self:getCurrentKey())) + end + if invOpen then return client.closeInventory() end - if invBusy then - return lib.notify({ id = 'inventory_player_access', type = 'error', description = locale('inventory_player_access') }) - end - - if not canOpenInventory() then + if invBusy or not canOpenInventory() then return lib.notify({ id = 'inventory_player_access', type = 'error', description = locale('inventory_player_access') }) end @@ -703,84 +788,7 @@ local function registerCommands() if entityType ~= 2 then return end - local position = GetEntityCoords(entity) - - if #(playerCoords - position) > 7 or GetVehiclePedIsEntering(playerPed) ~= 0 or not NetworkGetEntityIsNetworked(entity) then return end - - local vehicleHash = GetEntityModel(entity) - local vehicleClass = GetVehicleClass(entity) - local checkVehicle = Vehicles.Storage[vehicleHash] - - local netId = VehToNet(entity) - local isTrailer = lib.callback.await('ox_inventory:isVehicleATrailer', false, netId) - - -- No storage or no glovebox - if (checkVehicle == 0 or checkVehicle == 1) or (not Vehicles.trunk[vehicleClass] and not Vehicles.trunk.models[vehicleHash]) then return end - - if GetVehicleDoorLockStatus(entity) > 1 then - return lib.notify({ id = 'vehicle_locked', type = 'error', description = locale('vehicle_locked') }) - end - - local door, vehBone - - if checkVehicle == nil then -- No data, normal trunk - if isTrailer then - door, vehBone = 5, GetEntityBoneIndexByName(entity, 'wheel_rr') - else - door, vehBone = 5, GetEntityBoneIndexByName(entity, 'boot') - end - elseif checkVehicle == 3 then -- Trunk in hood - door, vehBone = 4, GetEntityBoneIndexByName(entity, 'bonnet') - else -- No storage or no trunk - return - end - - if vehBone == -1 then - if vehicleClass == 12 then - door = { 2, 3 } - end - - vehBone = GetEntityBoneIndexByName(entity, Vehicles.trunk.boneIndex[vehicleHash] or 'platelight') - end - - position = GetWorldPositionOfEntityBone(entity, vehBone) - - if #(playerCoords - position) < 3 and door then - local plate = GetVehicleNumberPlateText(entity) - local invId = 'trunk'..plate - - TaskTurnPedToFaceCoord(playerPed, position.x, position.y, position.z, 0) - - if not client.openInventory('trunk', { id = invId, netid = NetworkGetNetworkIdFromEntity(entity) }) then return end - - if type(door) == 'table' then - for i = 1, #door do - SetVehicleDoorOpen(entity, door[i], false, false) - end - else - SetVehicleDoorOpen(entity, door, false, false) - end - - Wait(200) - ---@todo animation for vans? - Utils.PlayAnim(0, 'anim@heists@prison_heiststation@cop_reactions', 'cop_b_idle', 3.0, 3.0, -1, 49, 0.0, 0, 0, 0) - currentInventory.entity = entity - currentInventory.door = door - - repeat - Wait(50) - - position = GetWorldPositionOfEntityBone(entity, vehBone) - - if #(GetEntityCoords(playerPed) - position) >= 3 or not DoesEntityExist(entity) then - break - end - - TaskTurnPedToFaceCoord(playerPed, position.x, position.y, position.z, 0) - until currentInventory?.entity ~= entity or not invOpen - - if invOpen then client.closeInventory() end - end + Inventory.OpenTrunk(entity) end }) @@ -861,9 +869,10 @@ RegisterNetEvent('ox_inventory:closeInventory', client.closeInventory) exports('closeInventory', client.closeInventory) ---@param data updateSlot[] ----@param weight number | table +---@param weight number local function updateInventory(data, weight) local changes = {} + ---@type table local itemCount = {} for i = 1, #data do @@ -873,14 +882,18 @@ local function updateInventory(data, weight) v.inventory = 'player' local item = v.item - if currentWeapon?.slot == item?.slot and item.metadata then - currentWeapon.metadata = item.metadata - TriggerEvent('ox_inventory:currentWeapon', currentWeapon) + if currentWeapon?.slot == item?.slot then + if item.metadata then + currentWeapon.metadata = item.metadata + TriggerEvent('ox_inventory:currentWeapon', currentWeapon) + else + currentWeapon = Weapon.Disarm(currentWeapon, true) + end end local curItem = PlayerData.inventory[item.slot] - if curItem?.name then + if curItem and curItem.name then itemCount[curItem.name] = (itemCount[curItem.name] or 0) - curItem.count end @@ -895,40 +908,35 @@ local function updateInventory(data, weight) end SendNUIMessage({ action = 'refreshSlots', data = { items = data, itemCount = itemCount} }) - client.setPlayerData('weight', type(weight) == 'number' and weight or weight.left) - for item, count in pairs(itemCount) do - local data = Items[item] + if weight ~= PlayerData.weight then client.setPlayerData('weight', weight) end - if count < 0 then - if currentWeapon and not currentWeapon.throwable and currentWeapon.slot == data.slot then - currentWeapon = Weapon.Disarm(currentWeapon) - end + for itemName, count in pairs(itemCount) do + local item = Items(itemName) - data.count += count + if item then + item.count += count - if shared.framework == 'esx' then - TriggerEvent('esx:removeInventoryItem', data.name, data.count) - else - TriggerEvent('ox_inventory:itemCount', data.name, data.count) - end + TriggerEvent('ox_inventory:itemCount', item.name, item.count) - if data.client?.remove then - data.client.remove(data.count) - end - elseif count > 0 then - data.count += count + if count < 0 then + if shared.framework == 'esx' then + TriggerEvent('esx:removeInventoryItem', item.name, item.count) + end - if shared.framework == 'esx' then - TriggerEvent('esx:addInventoryItem', data.name, data.count) - else - TriggerEvent('ox_inventory:itemCount', data.name, data.count) - end + if item.client?.remove then + item.client.remove(item.count) + end + elseif count > 0 then + if shared.framework == 'esx' then + TriggerEvent('esx:addInventoryItem', item.name, item.count) + end - if data.client?.add then - data.client.add(data.count) - end - end + if item.client?.add then + item.client.add(item.count) + end + end + end end client.setPlayerData('inventory', PlayerData.inventory) @@ -953,7 +961,7 @@ RegisterNetEvent('ox_inventory:inventoryReturned', function(data) items[num] = { item = slotData, inventory = cache.serverId } end - updateInventory(items, { left = data[3] }) + updateInventory(items, data[3]) end) RegisterNetEvent('ox_inventory:inventoryConfiscated', function(message) @@ -970,7 +978,7 @@ RegisterNetEvent('ox_inventory:inventoryConfiscated', function(message) items[num] = { item = { slot = slot }, inventory = cache.serverId } end - updateInventory(items, { left = 0 }) + updateInventory(items, 0) end) @@ -1065,8 +1073,6 @@ RegisterNetEvent('ox_inventory:removeDrop', function(dropId) end end) -local uiLoaded = false - ---@type function? local function setStateBagHandler(stateId) AddStateBagChangeHandler('invOpen', stateId, function(_, _, value) @@ -1077,6 +1083,12 @@ local function setStateBagHandler(stateId) invBusy = value end) + AddStateBagChangeHandler('canUseWeapons', stateId, function(_, _, value) + if not value and currentWeapon then + currentWeapon = Weapon.Disarm(currentWeapon) + end + end) + AddStateBagChangeHandler('instance', stateId, function(_, _, value) currentInstance = value @@ -1122,8 +1134,8 @@ lib.onCache('seat', function(seat) Utils.WeaponWheel(false) end) -lib.onCache('vehicle', function(vehicle) - if invOpen and currentInventory.entity == cache.vehicle then +lib.onCache('vehicle', function() + if invOpen and (not currentInventory.entity or currentInventory.entity == cache.vehicle) then return client.closeInventory() end end) @@ -1131,9 +1143,13 @@ end) RegisterNetEvent('ox_inventory:setPlayerInventory', function(currentDrops, inventory, weight, player) if source == '' then return end + ---@class PlayerData + ---@field inventory table + ---@field weight number PlayerData = player PlayerData.id = cache.playerId PlayerData.source = cache.serverId + PlayerData.maxWeight = shared.playerweight setmetatable(PlayerData, { __index = function(self, key) @@ -1244,7 +1260,7 @@ RegisterNetEvent('ox_inventory:setPlayerInventory', function(currentDrops, inven end end - for id, data in pairs(data('licenses')) do + for id, data in pairs(lib.load('data.licenses')) do lib.points.new({ coords = data.coords, distance = 16, @@ -1257,7 +1273,7 @@ RegisterNetEvent('ox_inventory:setPlayerInventory', function(currentDrops, inven }) end - while not uiLoaded do Wait(50) end + while not client.uiLoaded do Wait(50) end SendNUIMessage({ action = 'init', @@ -1387,7 +1403,7 @@ RegisterNetEvent('ox_inventory:setPlayerInventory', function(currentDrops, inven DisableControlAction(0, 36, true) end - if invBusy == true or IsPedCuffed(playerPed) then + if usingItem or invBusy == true or IsPedCuffed(playerPed) then DisablePlayerFiring(playerId, true) end @@ -1492,6 +1508,7 @@ RegisterNetEvent('ox_inventory:setPlayerInventory', function(currentDrops, inven plyState:set('invBusy', false, false) plyState:set('invOpen', false, false) plyState:set('invHotkeys', true, false) + plyState:set('canUseWeapons', true, false) collectgarbage('collect') end) @@ -1501,27 +1518,35 @@ AddEventHandler('onResourceStop', function(resourceName) end end) -RegisterNetEvent('ox_inventory:viewInventory', function(data) - if data and invOpen == false then - data.type = 'admin' - plyState.invOpen = true - currentInventory = data - currentInventory.ignoreSecurityChecks = true - - SendNUIMessage({ - action = 'setupInventory', - data = { - rightInventory = currentInventory, - } - }) - SetNuiFocus(true, true) +RegisterNetEvent('ox_inventory:viewInventory', function(left, right) + if source == '' then return end - if client.screenblur then TriggerScreenblurFadeIn(0) end - end + plyState.invOpen = true + + SetInterval(client.interval, 100) + SetNuiFocus(true, true) + SetNuiFocusKeepInput(true) + closeTrunk() + + if client.screenblur then TriggerScreenblurFadeIn(0) end + + currentInventory = right or defaultInventory + currentInventory.ignoreSecurityChecks = true + currentInventory.type = 'inspect' + left.items = PlayerData.inventory + left.groups = PlayerData.groups + + SendNUIMessage({ + action = 'setupInventory', + data = { + leftInventory = left, + rightInventory = currentInventory + } + }) end) RegisterNUICallback('uiLoaded', function(_, cb) - uiLoaded = true + client.uiLoaded = true cb(1) end) @@ -1542,6 +1567,8 @@ RegisterNUICallback('removeComponent', function(data, cb) local itemSlot = PlayerData.inventory[currentWeapon.slot] + if not itemSlot then return end + for _, component in pairs(Items[data.component].client.component) do if HasPedGotWeaponComponent(playerPed, currentWeapon.hash, component) then for k, v in pairs(itemSlot.metadata.components) do @@ -1550,6 +1577,7 @@ RegisterNUICallback('removeComponent', function(data, cb) if success then RemoveWeaponComponentFromPed(playerPed, currentWeapon.hash, component) + TriggerEvent('ox_inventory:updateWeaponComponent', 'removed', component, data.component) end break @@ -1577,66 +1605,94 @@ RegisterNUICallback('useItem', function(slot, cb) cb(1) end) +local function giveItemToTarget(serverId, slotId, count) + if type(slotId) ~= 'number' then return TypeError('slotId', 'number', type(slotId)) end + if count and type(count) ~= 'number' then return TypeError('count', 'number', type(count)) end + + if slotId == currentWeapon?.slot then + currentWeapon = Weapon.Disarm(currentWeapon) + end + + Utils.PlayAnim(0, 'mp_common', 'givetake1_a', 1.0, 1.0, 2000, 50, 0.0, 0, 0, 0) + TriggerServerEvent('ox_inventory:giveItem', slotId, serverId, count or 0) +end + +exports('giveItemToTarget', giveItemToTarget) + +local function isGiveTargetValid(ped, coords) + if cache.vehicle and GetVehiclePedIsIn(ped, false) == cache.vehicle then + return true + end + + local entity = Utils.Raycast(1|2|4|8|16, coords + vec3(0, 0, 0.5), 0.2) + + return entity == ped and IsEntityVisible(ped) +end + RegisterNUICallback('giveItem', function(data, cb) cb(1) - local target if client.giveplayerlist then - local nearbyPlayers, n = lib.getNearbyPlayers(GetEntityCoords(playerPed), 2.0), 0 + local nearbyPlayers = lib.getNearbyPlayers(GetEntityCoords(playerPed), 3.0) + local nearbyCount = #nearbyPlayers + + if nearbyCount == 0 then return end - if #nearbyPlayers == 0 then return end + if nearbyCount == 1 then + local option = nearbyPlayers[1] + + if not isGiveTargetValid(option.ped, option.coords) then return end + + return giveItemToTarget(GetPlayerServerId(option.id), data.slot, data.count) + end + + local giveList, n = {}, 0 for i = 1, #nearbyPlayers do local option = nearbyPlayers[i] - local ped = GetPlayerPed(option.id) - if ped > 0 and IsEntityVisible(ped) then + if isGiveTargetValid(option.ped, option.coords) then local playerName = GetPlayerName(option.id) option.id = GetPlayerServerId(option.id) + ---@diagnostic disable-next-line: inject-field option.label = ('[%s] %s'):format(option.id, playerName) n += 1 - nearbyPlayers[n] = option + giveList[n] = option end end - local p = promise.new() + if n == 0 then return end lib.registerMenu({ id = 'ox_inventory:givePlayerList', title = 'Give item', - options = nearbyPlayers, - onClose = function() p:resolve() end, - }, function(selected) p:resolve(selected and nearbyPlayers[selected].id) end) + options = giveList, + }, function(selected) + giveItemToTarget(giveList[selected].id, data.slot, data.count) + end) - lib.showMenu('ox_inventory:givePlayerList') + return lib.showMenu('ox_inventory:givePlayerList') + end - target = Citizen.Await(p) - elseif cache.vehicle then + if cache.vehicle then local seats = GetVehicleMaxNumberOfPassengers(cache.vehicle) - 1 if seats >= 0 then local passenger = GetPedInVehicleSeat(cache.vehicle, cache.seat - 2 * (cache.seat % 2) + 1) if passenger ~= 0 and IsEntityVisible(passenger) then - target = GetPlayerServerId(NetworkGetPlayerIndexFromPed(passenger)) + return giveItemToTarget(GetPlayerServerId(NetworkGetPlayerIndexFromPed(passenger)), data.slot, data.count) end end - else - local entity = Utils.Raycast(12) - if entity and IsPedAPlayer(entity) and IsEntityVisible(entity) and #(GetEntityCoords(playerPed, true) - GetEntityCoords(entity, true)) < 2.0 then - target = GetPlayerServerId(NetworkGetPlayerIndexFromPed(entity)) - Utils.PlayAnim(0, 'mp_common', 'givetake1_a', 1.0, 1.0, 2000, 50, 0.0, 0, 0, 0) - end + return end - if target then - if data.slot == currentWeapon?.slot then - currentWeapon = Weapon.Disarm(currentWeapon) - end + local entity = Utils.Raycast(1|2|4|8|16, GetOffsetFromEntityInWorldCoords(cache.ped, 0.0, 3.0, 0.5), 0.2) - TriggerServerEvent('ox_inventory:giveItem', data.slot, target, data.count) - end + if entity and IsPedAPlayer(entity) and IsEntityVisible(entity) and #(GetEntityCoords(playerPed, true) - GetEntityCoords(entity, true)) < 3.0 then + return giveItemToTarget(GetPlayerServerId(NetworkGetPlayerIndexFromPed(entity)), data.slot, data.count) + end end) RegisterNUICallback('useButton', function(data, cb) @@ -1649,8 +1705,32 @@ RegisterNUICallback('exit', function(_, cb) cb(1) end) +lib.callback.register('ox_inventory:startCrafting', function(id, recipe) + recipe = CraftingBenches[id].items[recipe] + + return lib.progressCircle({ + label = locale('crafting_item', recipe.metadata?.label or Items[recipe.name].label), + duration = recipe.duration or 3000, + canCancel = true, + disable = { + move = true, + combat = true, + }, + anim = { + dict = 'anim@amb@clubhouse@tutorial@bkr_tut_ig3@', + clip = 'machinic_loop_mechandplayer', + } + }) +end) + +local swapActive = false + ---Synchronise and validate all item movement between the NUI and server. RegisterNUICallback('swapItems', function(data, cb) + if swapActive or not invOpen or invBusy or usingItem then return cb(false) end + + swapActive = true + if data.toType == 'newdrop' then if cache.vehicle or IsPedFalling(playerPed) then return cb(false) end @@ -1688,15 +1768,16 @@ RegisterNUICallback('swapItems', function(data, cb) end local success, response, weaponSlot = lib.callback.await('ox_inventory:swapItems', false, data) + swapActive = false cb(success or false) if success then - if response then - if weaponSlot and currentWeapon then - currentWeapon.slot = weaponSlot - end + if weaponSlot and currentWeapon then + currentWeapon.slot = weaponSlot + end + if response then updateInventory(response.items, response.weight) end elseif response then diff --git a/server-data/resources/[ox]/ox_inventory/data/animations.lua b/server-data/resources/[ox]/ox_inventory/data/animations.lua index 172d9781a..acc24b743 100644 --- a/server-data/resources/[ox]/ox_inventory/data/animations.lua +++ b/server-data/resources/[ox]/ox_inventory/data/animations.lua @@ -1,8 +1,8 @@ return { anim = { - ["eating"] = { dict = "mp_player_inteat@burger", clip = "mp_player_int_eat_burger_fp" }, + ['eating'] = { dict = 'mp_player_inteat@burger', clip = 'mp_player_int_eat_burger_fp' }, }, prop = { - ["burger"] = { model = `prop_cs_burger_01`, pos = vec3(0.02, 0.02, -0.02), rot = vec3(0.0, 0.0, 0.0) }, - }, -} + ['burger'] = { model = `prop_cs_burger_01`, pos = vec3(0.02, 0.02, -0.02), rot = vec3(0.0, 0.0, 0.0) }, + } +} \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/data/crafting.lua b/server-data/resources/[ox]/ox_inventory/data/crafting.lua new file mode 100644 index 000000000..0044e6548 --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/data/crafting.lua @@ -0,0 +1,34 @@ +return { + { + items = { + { + name = 'lockpick', + ingredients = { + scrapmetal = 5, + WEAPON_HAMMER = 0.05 + }, + duration = 5000, + count = 2, + }, + }, + points = { + vec3(-1147.083008, -2002.662109, 13.180260), + vec3(-345.374969, -130.687088, 39.009613) + }, + zones = { + { + coords = vec3(-1146.2, -2002.05, 13.2), + size = vec3(3.8, 1.05, 0.15), + distance = 1.5, + rotation = 315.0, + }, + { + coords = vec3(-346.1, -130.45, 39.0), + size = vec3(3.8, 1.05, 0.15), + distance = 1.5, + rotation = 70.0, + }, + }, + blip = { id = 566, colour = 31, scale = 0.8 }, + }, +} diff --git a/server-data/resources/[ox]/ox_inventory/data/evidence.lua b/server-data/resources/[ox]/ox_inventory/data/evidence.lua index 53d337a27..a0e84da9c 100644 --- a/server-data/resources/[ox]/ox_inventory/data/evidence.lua +++ b/server-data/resources/[ox]/ox_inventory/data/evidence.lua @@ -2,13 +2,13 @@ return { { coords = vec3(458.97, -982.79, 30.68), target = { -- qtarget support - name = "mrpd_evidence", -- name of zone must be uniuqe + name = 'mrpd_evidence', -- name of zone must be uniuqe loc = vec3(459.07, -984.07, 30.69), length = 1.4, width = 3.2, heading = 0, minZ = 29.09, - maxZ = 31.89, - }, - }, -} + maxZ = 31.89 + } + } +} \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/data/items.lua b/server-data/resources/[ox]/ox_inventory/data/items.lua index b2d17f2f6..9ec1f429d 100644 --- a/server-data/resources/[ox]/ox_inventory/data/items.lua +++ b/server-data/resources/[ox]/ox_inventory/data/items.lua @@ -584,4 +584,137 @@ return { stack = true, close = true, }, -} + + ["alive_chicken"] = { + label = "Living chicken", + weight = 1, + stack = true, + close = true, + }, + + ["blowpipe"] = { + label = "Blowtorch", + weight = 2, + stack = true, + close = true, + }, + + ["carokit"] = { + label = "Body Kit", + weight = 3, + stack = true, + close = true, + }, + + ["carotool"] = { + label = "Tools", + weight = 2, + stack = true, + close = true, + }, + + ["clothe"] = { + label = "Cloth", + weight = 1, + stack = true, + close = true, + }, + + ["cutted_wood"] = { + label = "Cut wood", + weight = 1, + stack = true, + close = true, + }, + + ["essence"] = { + label = "Gas", + weight = 1, + stack = true, + close = true, + }, + + ["fabric"] = { + label = "Fabric", + weight = 1, + stack = true, + close = true, + }, + + ["fish"] = { + label = "Fish", + weight = 1, + stack = true, + close = true, + }, + + ["fixtool"] = { + label = "Repair Tools", + weight = 2, + stack = true, + close = true, + }, + + ["gazbottle"] = { + label = "Gas Bottle", + weight = 2, + stack = true, + close = true, + }, + + ["packaged_chicken"] = { + label = "Chicken fillet", + weight = 1, + stack = true, + close = true, + }, + + ["packaged_plank"] = { + label = "Packaged wood", + weight = 1, + stack = true, + close = true, + }, + + ["petrol"] = { + label = "Oil", + weight = 1, + stack = true, + close = true, + }, + + ["petrol_raffin"] = { + label = "Processed oil", + weight = 1, + stack = true, + close = true, + }, + + ["slaughtered_chicken"] = { + label = "Slaughtered chicken", + weight = 1, + stack = true, + close = true, + }, + + ["stone"] = { + label = "Stone", + weight = 1, + stack = true, + close = true, + }, + + ["washed_stone"] = { + label = "Washed stone", + weight = 1, + stack = true, + close = true, + }, + + ["wool"] = { + label = "Wool", + weight = 1, + stack = true, + close = true, + }, +} \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/data/vehicles.lua b/server-data/resources/[ox]/ox_inventory/data/vehicles.lua index 1441687a3..991beaf4c 100644 --- a/server-data/resources/[ox]/ox_inventory/data/vehicles.lua +++ b/server-data/resources/[ox]/ox_inventory/data/vehicles.lua @@ -37,57 +37,54 @@ return { -- slots, maxWeight; default weight is 8000 per slot glovebox = { - [0] = { 11, 88000 }, -- Compact - [1] = { 11, 88000 }, -- Sedan - [2] = { 11, 88000 }, -- SUV - [3] = { 11, 88000 }, -- Coupe - [4] = { 11, 88000 }, -- Muscle - [5] = { 11, 88000 }, -- Sports Classic - [6] = { 11, 88000 }, -- Sports - [7] = { 11, 88000 }, -- Super - [8] = { 5, 40000 }, -- Motorcycle - [9] = { 11, 88000 }, -- Offroad - [10] = { 11, 88000 }, -- Industrial - [11] = { 11, 88000 }, -- Utility - [12] = { 11, 88000 }, -- Van - [14] = { 31, 248000 }, -- Boat - [15] = { 31, 248000 }, -- Helicopter - [16] = { 51, 408000 }, -- Plane - [17] = { 11, 88000 }, -- Service - [18] = { 11, 88000 }, -- Emergency - [19] = { 11, 88000 }, -- Military - [20] = { 11, 88000 }, -- Commercial (trucks) + [0] = {11, 88000}, -- Compact + [1] = {11, 88000}, -- Sedan + [2] = {11, 88000}, -- SUV + [3] = {11, 88000}, -- Coupe + [4] = {11, 88000}, -- Muscle + [5] = {11, 88000}, -- Sports Classic + [6] = {11, 88000}, -- Sports + [7] = {11, 88000}, -- Super + [8] = {5, 40000}, -- Motorcycle + [9] = {11, 88000}, -- Offroad + [10] = {11, 88000}, -- Industrial + [11] = {11, 88000}, -- Utility + [12] = {11, 88000}, -- Van + [14] = {31, 248000}, -- Boat + [15] = {31, 248000}, -- Helicopter + [16] = {51, 408000}, -- Plane + [17] = {11, 88000}, -- Service + [18] = {11, 88000}, -- Emergency + [19] = {11, 88000}, -- Military + [20] = {11, 88000}, -- Commercial (trucks) models = { - [`xa21`] = { 11, 88000 }, - }, + [`xa21`] = {11, 88000} + } }, trunk = { - [0] = { 21, 168000 }, -- Compact - [1] = { 41, 328000 }, -- Sedan - [2] = { 51, 408000 }, -- SUV - [3] = { 31, 248000 }, -- Coupe - [4] = { 41, 328000 }, -- Muscle - [5] = { 31, 248000 }, -- Sports Classic - [6] = { 31, 248000 }, -- Sports - [7] = { 21, 168000 }, -- Super - [8] = { 5, 40000 }, -- Motorcycle - [9] = { 51, 408000 }, -- Offroad - [10] = { 51, 408000 }, -- Industrial - [11] = { 41, 328000 }, -- Utility - [12] = { 61, 488000 }, -- Van + [0] = {21, 168000}, -- Compact + [1] = {41, 328000}, -- Sedan + [2] = {51, 408000}, -- SUV + [3] = {31, 248000}, -- Coupe + [4] = {41, 328000}, -- Muscle + [5] = {31, 248000}, -- Sports Classic + [6] = {31, 248000}, -- Sports + [7] = {21, 168000}, -- Super + [8] = {5, 40000}, -- Motorcycle + [9] = {51, 408000}, -- Offroad + [10] = {51, 408000}, -- Industrial + [11] = {41, 328000}, -- Utility + [12] = {61, 488000}, -- Van -- [14] -- Boat -- [15] -- Helicopter -- [16] -- Plane - [17] = { 41, 328000 }, -- Service - [18] = { 41, 328000 }, -- Emergency - [19] = { 41, 328000 }, -- Military - [20] = { 61, 488000 }, -- Commercial + [17] = {41, 328000}, -- Service + [18] = {41, 328000}, -- Emergency + [19] = {41, 328000}, -- Military + [20] = {61, 488000}, -- Commercial models = { - [`xa21`] = { 11, 10000 }, - }, - boneIndex = { - [`pounder`] = "wheel_rr", + [`xa21`] = {11, 10000} }, - }, + } } diff --git a/server-data/resources/[ox]/ox_inventory/data/weapons.lua b/server-data/resources/[ox]/ox_inventory/data/weapons.lua index 975217049..6b88573e2 100644 --- a/server-data/resources/[ox]/ox_inventory/data/weapons.lua +++ b/server-data/resources/[ox]/ox_inventory/data/weapons.lua @@ -1,713 +1,712 @@ return { Weapons = { - ["WEAPON_ADVANCEDRIFLE"] = { - label = "Advanced Rifle", + ['WEAPON_TECPISTOL'] = { + label = 'Tactical SMG', + weight = 1500, + durability = 0.075, + ammoname = 'ammo-9', + }, + ['WEAPON_ADVANCEDRIFLE'] = { + label = 'Advanced Rifle', weight = 3100, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle', }, - ["WEAPON_APPISTOL"] = { - label = "AP Pistol", + ['WEAPON_APPISTOL'] = { + label = 'AP Pistol', weight = 1400, durability = 0.1, - ammoname = "ammo-9", + ammoname = 'ammo-9', }, - ["WEAPON_ASSAULTRIFLE"] = { - label = "Assault Rifle", + ['WEAPON_ASSAULTRIFLE'] = { + label = 'Assault Rifle', weight = 4500, durability = 0.03, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2', }, - ["WEAPON_ASSAULTRIFLE_MK2"] = { - label = "Assault Rifle MK2", + ['WEAPON_ASSAULTRIFLE_MK2'] = { + label = 'Assault Rifle MK2', weight = 2950, durability = 0.03, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2', }, - ["WEAPON_ASSAULTSHOTGUN"] = { - label = "Assault Shotgun", + ['WEAPON_ASSAULTSHOTGUN'] = { + label = 'Assault Shotgun', weight = 5200, durability = 0.05, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_ASSAULTSMG"] = { - label = "Assault SMG", + ['WEAPON_ASSAULTSMG'] = { + label = 'Assault SMG', weight = 2900, durability = 0.05, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_BALL"] = { - label = "Ball", + ['WEAPON_BALL'] = { + label = 'Ball', weight = 149, throwable = true, }, - ["WEAPON_BAT"] = { - label = "Bat", + ['WEAPON_BAT'] = { + label = 'Bat', weight = 1134, durability = 0.1, }, - ["WEAPON_BATTLEAXE"] = { - label = "Battle Axe", + ['WEAPON_BATTLEAXE'] = { + label = 'Battle Axe', weight = 6500, durability = 0.1, }, - ["WEAPON_BOTTLE"] = { - label = "Bottle", + ['WEAPON_BOTTLE'] = { + label = 'Bottle', weight = 350, durability = 0.1, }, - ["WEAPON_BULLPUPRIFLE"] = { - label = "Bullpup Rifle", + ['WEAPON_BULLPUPRIFLE'] = { + label = 'Bullpup Rifle', weight = 2900, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_BULLPUPRIFLE_MK2"] = { - label = "Bullpup Rifle MK2", + ['WEAPON_BULLPUPRIFLE_MK2'] = { + label = 'Bullpup Rifle MK2', weight = 2900, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_BULLPUPSHOTGUN"] = { - label = "Bullpup Shotgun", + ['WEAPON_BULLPUPSHOTGUN'] = { + label = 'Bullpup Shotgun', weight = 3100, durability = 0.2, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_BZGAS"] = { - label = "BZ Gas", + ['WEAPON_BZGAS'] = { + label = 'BZ Gas', weight = 600, throwable = true, }, - ["WEAPON_CARBINERIFLE"] = { - label = "Carbine Rifle", + ['WEAPON_CARBINERIFLE'] = { + label = 'Carbine Rifle', weight = 3100, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_CARBINERIFLE_MK2"] = { - label = "Carbine Rifle MK2", + ['WEAPON_CARBINERIFLE_MK2'] = { + label = 'Carbine Rifle MK2', weight = 3000, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_CERAMICPISTOL"] = { - label = "Ceramic Pistol", + ['WEAPON_CERAMICPISTOL'] = { + label = 'Ceramic Pistol', weight = 800, durability = 0.2, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_PISTOLXM3"] = { - label = "WM 29 Pistol", + ['WEAPON_PISTOLXM3'] = { + label = 'WM 29 Pistol', weight = 969, durability = 0.2, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_COMBATMG"] = { - label = "Combat MG", + ['WEAPON_COMBATMG'] = { + label = 'Combat MG', weight = 7500, durability = 0.02, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_COMBATMG_MK2"] = { - label = "Combat MG MK2", + ['WEAPON_COMBATMG_MK2'] = { + label = 'Combat MG MK2', weight = 8000, durability = 0.02, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2' }, - ["WEAPON_COMBATPDW"] = { - label = "Combat PDW", + ['WEAPON_COMBATPDW'] = { + label = 'Combat PDW', weight = 2300, durability = 0.1, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_COMBATPISTOL"] = { - label = "Combat Pistol", + ['WEAPON_COMBATPISTOL'] = { + label = 'Combat Pistol', weight = 785, durability = 0.2, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_COMBATSHOTGUN"] = { - label = "Combat Shotgun", + ['WEAPON_COMBATSHOTGUN'] = { + label = 'Combat Shotgun', weight = 4400, durability = 0.2, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_COMPACTLAUNCHER"] = { - label = "Compact Grenade Launcher", + ['WEAPON_COMPACTLAUNCHER'] = { + label = 'Compact Grenade Launcher', weight = 2500, durability = 0.05, - ammoname = "ammo-grenade", + ammoname = 'ammo-grenade' }, - ["WEAPON_COMPACTRIFLE"] = { - label = "Compact Rifle", + ['WEAPON_COMPACTRIFLE'] = { + label = 'Compact Rifle', weight = 3600, durability = 0.05, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2' }, - ["WEAPON_CROWBAR"] = { - label = "Crowbar", + ['WEAPON_CROWBAR'] = { + label = 'Crowbar', weight = 2500, durability = 0.1, }, - ["WEAPON_DAGGER"] = { - label = "Dagger", + ['WEAPON_DAGGER'] = { + label = 'Dagger', weight = 800, durability = 0.1, }, - ["WEAPON_DBSHOTGUN"] = { - label = "Double Barrel Shotgun", + ['WEAPON_DBSHOTGUN'] = { + label = 'Double Barrel Shotgun', weight = 3175, durability = 0.4, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_DOUBLEACTION"] = { - label = "Double Action Revolver", + ['WEAPON_DOUBLEACTION'] = { + label = 'Double Action Revolver', weight = 940, durability = 0.2, - ammoname = "ammo-38", + ammoname = 'ammo-38' }, - ["WEAPON_EMPLAUNCHER"] = { - label = "Compact EMP Launcher", + ['WEAPON_EMPLAUNCHER'] = { + label = 'Compact EMP Launcher', weight = 2750, durability = 0.2, - ammoname = "ammo-emp", + ammoname = 'ammo-emp' }, - ["WEAPON_FIREEXTINGUISHER"] = { - label = "Fire Extinguisher", + ['WEAPON_FIREEXTINGUISHER'] = { + label = 'Fire Extinguisher', weight = 8616, }, - ["WEAPON_FIREWORK"] = { - label = "Firework Launcher", + ['WEAPON_FIREWORK'] = { + label = 'Firework Launcher', weight = 1000, durability = 0.5, - ammoname = "ammo-firework", + ammoname = 'ammo-firework' }, - ["WEAPON_FLARE"] = { - label = "Flare", + ['WEAPON_FLARE'] = { + label = 'Flare', weight = 250, throwable = true, }, - ["WEAPON_FLAREGUN"] = { - label = "Flare Gun", + ['WEAPON_FLAREGUN'] = { + label = 'Flare Gun', weight = 1000, durability = 0.5, - ammoname = "ammo-flare", + ammoname = 'ammo-flare' }, - ["WEAPON_FLASHLIGHT"] = { - label = "Flashlight", + ['WEAPON_FLASHLIGHT'] = { + label = 'Flashlight', weight = 125, durability = 0.1, }, - ["WEAPON_GOLFCLUB"] = { - label = "Golf Club", + ['WEAPON_GOLFCLUB'] = { + label = 'Golf Club', weight = 330, durability = 0.1, }, - ["WEAPON_GRENADE"] = { - label = "Grenade", + ['WEAPON_GRENADE'] = { + label = 'Grenade', weight = 400, throwable = true, }, - ["WEAPON_GRENADELAUNCHER"] = { - label = "Grenade Launcher", + ['WEAPON_GRENADELAUNCHER'] = { + label = 'Grenade Launcher', weight = 6500, durability = 0.05, - ammoname = "ammo-grenade", + ammoname = 'ammo-grenade' }, - ["WEAPON_GUSENBERG"] = { - label = "Gusenberg", + ['WEAPON_GUSENBERG'] = { + label = 'Gusenberg', weight = 4900, durability = 0.04, - ammoname = "ammo-45", + ammoname = 'ammo-45' }, - ["WEAPON_HAMMER"] = { - label = "Hammer", + ['WEAPON_HAMMER'] = { + label = 'Hammer', weight = 1200, durability = 0.1, }, - ["WEAPON_HATCHET"] = { - label = "Hatchet", + ['WEAPON_HATCHET'] = { + label = 'Hatchet', weight = 1000, durability = 0.1, }, - ["WEAPON_HEAVYRIFLE"] = { - label = "Heavy Rifle", + ['WEAPON_HEAVYRIFLE'] = { + label = 'Heavy Rifle', weight = 3300, durability = 0.2, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_HAZARDCAN"] = { - label = "Hazard Can", + ['WEAPON_HAZARDCAN'] = { + label = 'Hazard Can', weight = 12000, }, - ["WEAPON_METALDETECTOR"] = { - label = "Metal Detector", + ['WEAPON_METALDETECTOR'] = { + label = 'Metal Detector', weight = 1200, }, - ["WEAPON_HOMINGLAUNCHER"] = { - label = "Homing Launcher", + ['WEAPON_HOMINGLAUNCHER'] = { + label = 'Homing Launcher', weight = 10000, durability = 0.6, - ammoname = "ammo-rocket", + ammoname = 'ammo-rocket' }, - ["WEAPON_FERTILIZERCAN"] = { - label = "Fertilizer Can", + ['WEAPON_FERTILIZERCAN'] = { + label = 'Fertilizer Can', weight = 12000, }, - ["WEAPON_HEAVYPISTOL"] = { - label = "Heavy Pistol", + ['WEAPON_HEAVYPISTOL'] = { + label = 'Heavy Pistol', weight = 1100, durability = 0.2, - ammoname = "ammo-45", + ammoname = 'ammo-45' }, - ["WEAPON_HEAVYSHOTGUN"] = { - label = "Heavy Shotgun", + ['WEAPON_HEAVYSHOTGUN'] = { + label = 'Heavy Shotgun', weight = 3600, durability = 0.1, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_HEAVYSNIPER"] = { - label = "Heavy Sniper", + ['WEAPON_HEAVYSNIPER'] = { + label = 'Heavy Sniper', weight = 12700, durability = 0.5, - ammoname = "ammo-heavysniper", + ammoname = 'ammo-heavysniper' }, - ["WEAPON_HEAVYSNIPER_MK2"] = { - label = "Heavy Sniper MK2", + ['WEAPON_HEAVYSNIPER_MK2'] = { + label = 'Heavy Sniper MK2', weight = 14000, durability = 0.5, - ammoname = "ammo-heavysniper", + ammoname = 'ammo-heavysniper' }, - ["WEAPON_KNIFE"] = { - label = "Knife", + ['WEAPON_KNIFE'] = { + label = 'Knife', weight = 300, durability = 0.1, }, - ["WEAPON_KNUCKLE"] = { - label = "Knuckle Dusters", + ['WEAPON_KNUCKLE'] = { + label = 'Knuckle Dusters', weight = 300, durability = 0.1, }, - ["WEAPON_MACHETE"] = { - label = "Machete", + ['WEAPON_MACHETE'] = { + label = 'Machete', weight = 1000, durability = 0.1, }, - ["WEAPON_MACHINEPISTOL"] = { - label = "Machine Pistol", + ['WEAPON_MACHINEPISTOL'] = { + label = 'Machine Pistol', weight = 1400, durability = 0.05, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_MARKSMANPISTOL"] = { - label = "Marksman Pistol", + ['WEAPON_MARKSMANPISTOL'] = { + label = 'Marksman Pistol', weight = 1588, durability = 0.5, - ammoname = "ammo-22", + ammoname = 'ammo-22' }, - ["WEAPON_MARKSMANRIFLE"] = { - label = "Marksman Rifle", + ['WEAPON_MARKSMANRIFLE'] = { + label = 'Marksman Rifle', weight = 7500, durability = 0.4, - ammoname = "ammo-sniper", + ammoname = 'ammo-sniper' }, - ["WEAPON_MARKSMANRIFLE_MK2"] = { - label = "Marksman Rifle MK2", + ['WEAPON_MARKSMANRIFLE_MK2'] = { + label = 'Marksman Rifle MK2', weight = 4000, durability = 0.4, - ammoname = "ammo-sniper", + ammoname = 'ammo-sniper' }, - ["WEAPON_MG"] = { - label = "Machine Gun", + ['WEAPON_MG'] = { + label = 'Machine Gun', weight = 9000, durability = 0.02, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2' }, - ["WEAPON_MINIGUN"] = { - label = "Minigun", + ['WEAPON_MINIGUN'] = { + label = 'Minigun', weight = 38500, durability = 0.1, - ammoname = "ammo-rifle2", + ammoname = 'ammo-rifle2' }, - ["WEAPON_MICROSMG"] = { - label = "Micro SMG", + ['WEAPON_MICROSMG'] = { + label = 'Micro SMG', weight = 3000, durability = 0.1, - ammoname = "ammo-45", + ammoname = 'ammo-45' }, - ["WEAPON_MILITARYRIFLE"] = { - label = "Military Rifle", + ['WEAPON_MILITARYRIFLE'] = { + label = 'Military Rifle', weight = 3600, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_MINISMG"] = { - label = "Mini SMG", + ['WEAPON_MINISMG'] = { + label = 'Mini SMG', weight = 1270, durability = 0.05, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_MOLOTOV"] = { - label = "Molotov", + ['WEAPON_MOLOTOV'] = { + label = 'Molotov', weight = 1800, throwable = true, }, - ["WEAPON_MUSKET"] = { - label = "Musket", + ['WEAPON_MUSKET'] = { + label = 'Musket', weight = 4500, durability = 0.5, - ammoname = "ammo-musket", + ammoname = 'ammo-musket' }, - ["WEAPON_NAVYREVOLVER"] = { - label = "Navy Revolver", + ['WEAPON_NAVYREVOLVER'] = { + label = 'Navy Revolver', weight = 4000, durability = 0.2, - ammoname = "ammo-44", + ammoname = 'ammo-44' }, - ["WEAPON_NIGHTSTICK"] = { - label = "Nightstick", + ['WEAPON_NIGHTSTICK'] = { + label = 'Nightstick', weight = 1000, durability = 0.1, }, - ["WEAPON_PETROLCAN"] = { - label = "Gas Can", + ['WEAPON_PETROLCAN'] = { + label = 'Gas Can', weight = 12000, }, - ["WEAPON_GADGETPISTOL"] = { - label = "Perico Pistol", + ['WEAPON_GADGETPISTOL'] = { + label = 'Perico Pistol', weight = 1750, durability = 0.1, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_PIPEBOMB"] = { - label = "Pipe Bomb", + ['WEAPON_PIPEBOMB'] = { + label = 'Pipe Bomb', weight = 1800, throwable = true, }, - ["WEAPON_PISTOL"] = { - label = "Pistol", + ['WEAPON_PISTOL'] = { + label = 'Pistol', weight = 1130, durability = 0.1, - ammoname = "ammo-9", + ammoname = 'ammo-9', }, - ["WEAPON_PISTOL50"] = { - label = "Pistol .50", + ['WEAPON_PISTOL50'] = { + label = 'Pistol .50', weight = 2000, durability = 0.1, - ammoname = "ammo-50", + ammoname = 'ammo-50' }, - ["WEAPON_PISTOL_MK2"] = { - label = "Pistol MK2", + ['WEAPON_PISTOL_MK2'] = { + label = 'Pistol MK2', weight = 1000, durability = 0.5, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_POOLCUE"] = { - label = "Pool Cue", + ['WEAPON_POOLCUE'] = { + label = 'Pool Cue', weight = 146, durability = 0.1, }, - ["WEAPON_CANDYCANE"] = { - label = "Candy Cane", + ['WEAPON_CANDYCANE'] = { + label = 'Candy Cane', weight = 85, durability = 0.1, }, - ["WEAPON_PROXMINE"] = { - label = "Proximity Mine", + ['WEAPON_PROXMINE'] = { + label = 'Proximity Mine', weight = 2500, throwable = true, }, - ["WEAPON_PUMPSHOTGUN"] = { - label = "Pump Shotgun", + ['WEAPON_PUMPSHOTGUN'] = { + label = 'Pump Shotgun', weight = 3400, durability = 0.1, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_PUMPSHOTGUN_MK2"] = { - label = "Pump Shotgun MK2", + ['WEAPON_PUMPSHOTGUN_MK2'] = { + label = 'Pump Shotgun MK2', weight = 3200, durability = 0.1, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_RAILGUN"] = { - label = "Railgun", + ['WEAPON_RAILGUN'] = { + label = 'Railgun', weight = 3570, durability = 0.5, - ammoname = "ammo-railgun", + ammoname = 'ammo-railgun' }, - ["WEAPON_RAILGUNXM3"] = { - label = "Railgun XM3", + ['WEAPON_RAILGUNXM3'] = { + label = 'Railgun XM3', weight = 3570, durability = 0.5, - ammoname = "ammo-railgun", + ammoname = 'ammo-railgun' }, - ["WEAPON_RAYCARBINE"] = { - label = "Unholy Hellbringer", + ['WEAPON_RAYCARBINE'] = { + label = 'Unholy Hellbringer', weight = 3620, durability = 0.2, - ammoname = "ammo-laser", + ammoname = 'ammo-laser' }, - ["WEAPON_RAYPISTOL"] = { - label = "Up-n-Atomizer", + ['WEAPON_RAYPISTOL'] = { + label = 'Up-n-Atomizer', weight = 1540, - durability = 0.5, + durability = 0.5 }, - ["WEAPON_REVOLVER"] = { - label = "Revolver", + ['WEAPON_REVOLVER'] = { + label = 'Revolver', weight = 2260, durability = 0.1, - ammoname = "ammo-44", + ammoname = 'ammo-44' }, - ["WEAPON_REVOLVER_MK2"] = { - label = "Revolver MK2", + ['WEAPON_REVOLVER_MK2'] = { + label = 'Revolver MK2', weight = 2600, durability = 0.1, - ammoname = "ammo-44", + ammoname = 'ammo-44' }, - ["WEAPON_RPG"] = { - label = "RPG", + ['WEAPON_RPG'] = { + label = 'RPG', weight = 5000, durability = 0.3, - ammoname = "ammo-rocket", + ammoname = 'ammo-rocket' }, - ["WEAPON_SAWNOFFSHOTGUN"] = { - label = "Sawn Off Shotgun", + ['WEAPON_SAWNOFFSHOTGUN'] = { + label = 'Sawn Off Shotgun', weight = 2380, durability = 0.1, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_SMG"] = { - label = "SMG", + ['WEAPON_SMG'] = { + label = 'SMG', weight = 3084, durability = 0.8, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_SMG_MK2"] = { - label = "SMG Mk2", + ['WEAPON_SMG_MK2'] = { + label = 'SMG Mk2', weight = 2700, durability = 0.05, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_SMOKEGRENADE"] = { - label = "Smoke Grenade", + ['WEAPON_SMOKEGRENADE'] = { + label = 'Smoke Grenade', weight = 600, throwable = true, }, - ["WEAPON_SNIPERRIFLE"] = { - label = "Sniper Rifle", + ['WEAPON_SNIPERRIFLE'] = { + label = 'Sniper Rifle', weight = 5000, durability = 0.5, - ammoname = "ammo-sniper", + ammoname = 'ammo-sniper' }, - ["WEAPON_SNOWBALL"] = { - label = "Snow Ball", + ['WEAPON_SNOWBALL'] = { + label = 'Snow Ball', weight = 5, throwable = true, }, - ["WEAPON_SNSPISTOL"] = { - label = "SNS Pistol", + ['WEAPON_SNSPISTOL'] = { + label = 'SNS Pistol', weight = 465, durability = 0.1, - ammoname = "ammo-45", + ammoname = 'ammo-45' }, - ["WEAPON_SNSPISTOL_MK2"] = { - label = "SNS Pistol MK2", + ['WEAPON_SNSPISTOL_MK2'] = { + label = 'SNS Pistol MK2', weight = 465, durability = 0.1, - ammoname = "ammo-45", + ammoname = 'ammo-45' }, - ["WEAPON_SPECIALCARBINE"] = { - label = "Special Carbine", + ['WEAPON_SPECIALCARBINE'] = { + label = 'Special Carbine', weight = 3000, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_SPECIALCARBINE_MK2"] = { - label = "Special Carbine MK2", + ['WEAPON_SPECIALCARBINE_MK2'] = { + label = 'Special Carbine MK2', weight = 3370, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_STICKYBOMB"] = { - label = "Sticky Bomb", + ['WEAPON_STICKYBOMB'] = { + label = 'Sticky Bomb', weight = 1000, throwable = true, }, - ["WEAPON_STONE_HATCHET"] = { - label = "Stone Hatchet", + ['WEAPON_STONE_HATCHET'] = { + label = 'Stone Hatchet', weight = 800, durability = 0.1, }, - ["WEAPON_STUNGUN"] = { - label = "Tazer", + ['WEAPON_STUNGUN'] = { + label = 'Tazer', weight = 227, durability = 0.1, }, - ["WEAPON_AUTOSHOTGUN"] = { - label = "Sweeper Shotgun", + ['WEAPON_AUTOSHOTGUN'] = { + label = 'Sweeper Shotgun', weight = 4400, durability = 0.05, - ammoname = "ammo-shotgun", + ammoname = 'ammo-shotgun' }, - ["WEAPON_SWITCHBLADE"] = { - label = "Switchblade", + ['WEAPON_SWITCHBLADE'] = { + label = 'Switchblade', weight = 300, durability = 0.1, - anim = { - "anim@melee@switchblade@holster", - "unholster", - 200, - "anim@melee@switchblade@holster", - "holster", - 600, - }, - }, - - ["WEAPON_VINTAGEPISTOL"] = { - label = "Vintage Pistol", + anim = { 'anim@melee@switchblade@holster', 'unholster', 200, 'anim@melee@switchblade@holster', 'holster', 600 }, + }, + + ['WEAPON_VINTAGEPISTOL'] = { + label = 'Vintage Pistol', weight = 700, durability = 0.1, - ammoname = "ammo-9", + ammoname = 'ammo-9' }, - ["WEAPON_RAYMINIGUN"] = { - label = "Widowmaker", + ['WEAPON_RAYMINIGUN'] = { + label = 'Widowmaker', weight = 7000, durability = 0.1, - ammoname = "ammo-laser", + ammoname = 'ammo-laser' }, - ["WEAPON_WRENCH"] = { - label = "Wrench", + ['WEAPON_WRENCH'] = { + label = 'Wrench', weight = 2500, durability = 0.1, }, - ["WEAPON_PRECISIONRIFLE"] = { - label = "Precision Rifle", + ['WEAPON_PRECISIONRIFLE'] = { + label = 'Precision Rifle', weight = 4800, durability = 0.4, - ammoname = "ammo-sniper", + ammoname = 'ammo-sniper' }, - ["WEAPON_TACTICALRIFLE"] = { - label = "Tactical Rifle", + ['WEAPON_TACTICALRIFLE'] = { + label = 'Tactical Rifle', weight = 3400, durability = 0.03, - ammoname = "ammo-rifle", + ammoname = 'ammo-rifle' }, - ["WEAPON_TEARGAS"] = { - label = "Tear Gas", + ['WEAPON_TEARGAS'] = { + label = 'Tear Gas', weight = 600, throwable = true, }, }, Components = { - ["at_flashlight"] = { - label = "Tactical Flashlight", + ['at_flashlight'] = { + label = 'Tactical Flashlight', weight = 120, - type = "flashlight", + type = 'flashlight', client = { component = { `COMPONENT_AT_AR_FLSH`, @@ -716,56 +715,56 @@ return { `COMPONENT_AT_PI_FLSH_02`, `COMPONENT_AT_PI_FLSH_03`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_suppressor_light"] = { - label = "Suppressor", + ['at_suppressor_light'] = { + label = 'Suppressor', weight = 280, - type = "muzzle", + type = 'muzzle', client = { component = { `COMPONENT_AT_PI_SUPP`, `COMPONENT_AT_PI_SUPP_02`, `COMPONENT_CERAMICPISTOL_SUPP`, - `COMPONENT_PISTOLXM3_SUPP`, + `COMPONENT_PISTOLXM3_SUPP` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_suppressor_heavy"] = { - label = "Tactical Suppressor", + ['at_suppressor_heavy'] = { + label = 'Tactical Suppressor', weight = 280, - type = "muzzle", + type = 'muzzle', client = { component = { `COMPONENT_AT_AR_SUPP`, `COMPONENT_AT_AR_SUPP_02`, `COMPONENT_AT_SR_SUPP`, - `COMPONENT_AT_SR_SUPP_03`, + `COMPONENT_AT_SR_SUPP_03` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_grip"] = { - label = "Grip", - type = "grip", + ['at_grip'] = { + label = 'Grip', + type = 'grip', weight = 280, client = { component = { `COMPONENT_AT_AR_AFGRIP`, - `COMPONENT_AT_AR_AFGRIP_02`, + `COMPONENT_AT_AR_AFGRIP_02` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_barrel"] = { - label = "Heavy Barrel", - type = "barrel", + ['at_barrel'] = { + label = 'Heavy Barrel', + type = 'barrel', weight = 280, client = { component = { @@ -778,13 +777,13 @@ return { `COMPONENT_AT_SC_BARREL_02`, `COMPONENT_AT_SR_BARREL_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_pistol"] = { - label = "Extended Pistol Clip", - type = "magazine", + ['at_clip_extended_pistol'] = { + label = 'Extended Pistol Clip', + type = 'magazine', weight = 280, client = { component = { @@ -798,14 +797,15 @@ return { `COMPONENT_SNSPISTOL_CLIP_02`, `COMPONENT_SNSPISTOL_MK2_CLIP_02`, `COMPONENT_VINTAGEPISTOL_CLIP_02`, + `COMPONENT_TECPISTOL_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_smg"] = { - label = "Extended SMG Clip", - type = "magazine", + ['at_clip_extended_smg'] = { + label = 'Extended SMG Clip', + type = 'magazine', weight = 280, client = { component = { @@ -817,26 +817,26 @@ return { `COMPONENT_SMG_CLIP_02`, `COMPONENT_SMG_MK2_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_shotgun"] = { - label = "Extended Shotgun Clip", - type = "magazine", + ['at_clip_extended_shotgun'] = { + label = 'Extended Shotgun Clip', + type = 'magazine', weight = 280, client = { component = { `COMPONENT_ASSAULTSHOTGUN_CLIP_02`, `COMPONENT_HEAVYSHOTGUN_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_rifle"] = { - label = "Extended Rifle Clip", - type = "magazine", + ['at_clip_extended_rifle'] = { + label = 'Extended Rifle Clip', + type = 'magazine', weight = 280, client = { component = { @@ -854,13 +854,13 @@ return { `COMPONENT_SPECIALCARBINE_MK2_CLIP_02`, `COMPONENT_TACTICALRIFLE_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_mg"] = { - label = "Extended MG Clip", - type = "magazine", + ['at_clip_extended_mg'] = { + label = 'Extended MG Clip', + type = 'magazine', weight = 280, client = { component = { @@ -869,13 +869,13 @@ return { `COMPONENT_COMBATMG_CLIP_02`, `COMPONENT_COMBATMG_MK2_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_extended_sniper"] = { - label = "Extended Sniper Clip", - type = "magazine", + ['at_clip_extended_sniper'] = { + label = 'Extended Sniper Clip', + type = 'magazine', weight = 280, client = { component = { @@ -883,13 +883,13 @@ return { `COMPONENT_MARKSMANRIFLE_CLIP_02`, `COMPONENT_MARKSMANRIFLE_MK2_CLIP_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_drum_smg"] = { - label = "SMG Drum", - type = "magazine", + ['at_clip_drum_smg'] = { + label = 'SMG Drum', + type = 'magazine', weight = 280, client = { component = { @@ -897,25 +897,25 @@ return { `COMPONENT_MACHINEPISTOL_CLIP_03`, `COMPONENT_SMG_CLIP_03`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_drum_shotgun"] = { - label = "Shotgun Drum", - type = "magazine", + ['at_clip_drum_shotgun'] = { + label = 'Shotgun Drum', + type = 'magazine', weight = 280, client = { component = { - `COMPONENT_HEAVYSHOTGUN_CLIP_03`, + `COMPONENT_HEAVYSHOTGUN_CLIP_03` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_clip_drum_rifle"] = { - label = "Rifle Drum", - type = "magazine", + ['at_clip_drum_rifle'] = { + label = 'Rifle Drum', + type = 'magazine', weight = 280, client = { component = { @@ -924,27 +924,27 @@ return { `COMPONENT_CARBINERIFLE_CLIP_03`, `COMPONENT_SPECIALCARBINE_CLIP_03`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_compensator"] = { - label = "Compensator", - type = "muzzle", + ['at_compensator'] = { + label = 'Compensator', + type = 'muzzle', weight = 280, client = { component = { `COMPONENT_AT_PI_COMP`, `COMPONENT_AT_PI_COMP_02`, - `COMPONENT_AT_PI_COMP_03`, + `COMPONENT_AT_PI_COMP_03` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_macro"] = { - label = "Macro Scope", - type = "sight", + ['at_scope_macro'] = { + label = 'Macro Scope', + type = 'sight', weight = 280, client = { component = { @@ -952,214 +952,214 @@ return { `COMPONENT_AT_SCOPE_MACRO_02`, `COMPONENT_AT_SCOPE_MACRO_MK2`, `COMPONENT_AT_SCOPE_MACRO_02_MK2`, - `COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2`, + `COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_small"] = { - label = "Small Scope", - type = "sight", + ['at_scope_small'] = { + label = 'Small Scope', + type = 'sight', weight = 280, client = { component = { `COMPONENT_AT_SCOPE_SMALL`, `COMPONENT_AT_SCOPE_SMALL_02`, `COMPONENT_AT_SCOPE_SMALL_MK2`, - `COMPONENT_AT_SCOPE_SMALL_SMG_MK2`, + `COMPONENT_AT_SCOPE_SMALL_SMG_MK2` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_medium"] = { - label = "Medium Scope", - type = "sight", + ['at_scope_medium'] = { + label = 'Medium Scope', + type = 'sight', weight = 280, client = { component = { `COMPONENT_AT_SCOPE_MEDIUM`, - `COMPONENT_AT_SCOPE_MEDIUM_MK2`, + `COMPONENT_AT_SCOPE_MEDIUM_MK2` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_large"] = { - label = "Large Scope", - type = "sight", + ['at_scope_large'] = { + label = 'Large Scope', + type = 'sight', weight = 280, client = { component = { - `COMPONENT_AT_SCOPE_LARGE_MK2`, + `COMPONENT_AT_SCOPE_LARGE_MK2` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_advanced"] = { - label = "Advanced Scope", - type = "sight", + ['at_scope_advanced'] = { + label = 'Advanced Scope', + type = 'sight', weight = 280, client = { component = { - `COMPONENT_AT_SCOPE_MAX`, + `COMPONENT_AT_SCOPE_MAX` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_nv"] = { - label = "NV Scope", - type = "sight", + ['at_scope_nv'] = { + label = 'NV Scope', + type = 'sight', weight = 420, client = { component = { - `COMPONENT_AT_SCOPE_NV`, + `COMPONENT_AT_SCOPE_NV` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_thermal"] = { - label = "Thermal Scope", - type = "sight", + ['at_scope_thermal'] = { + label = 'Thermal Scope', + type = 'sight', weight = 420, client = { component = { - `COMPONENT_AT_SCOPE_THERMAL`, + `COMPONENT_AT_SCOPE_THERMAL` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_scope_holo"] = { - label = "Holographic Sight", - type = "sight", + ['at_scope_holo'] = { + label = 'Holographic Sight', + type = 'sight', weight = 280, client = { component = { `COMPONENT_AT_PI_RAIL`, `COMPONENT_AT_PI_RAIL_02`, `COMPONENT_AT_SIGHTS`, - `COMPONENT_AT_SIGHTS_SMG`, + `COMPONENT_AT_SIGHTS_SMG` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_flat"] = { - label = "Flat Muzzle", - type = "muzzle", + ['at_muzzle_flat'] = { + label = 'Flat Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_01`, + `COMPONENT_AT_MUZZLE_01` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_tactical"] = { - label = "Tactical Muzzle", - type = "muzzle", + ['at_muzzle_tactical'] = { + label = 'Tactical Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_02`, + `COMPONENT_AT_MUZZLE_02` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_fat"] = { - label = "Fat Muzzle", - type = "muzzle", + ['at_muzzle_fat'] = { + label = 'Fat Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_03`, + `COMPONENT_AT_MUZZLE_03` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_precision"] = { - label = "Precision Muzzle", - type = "muzzle", + ['at_muzzle_precision'] = { + label = 'Precision Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_04`, + `COMPONENT_AT_MUZZLE_04` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_heavy"] = { - label = "Heavy Muzzle", - type = "muzzle", + ['at_muzzle_heavy'] = { + label = 'Heavy Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_05`, + `COMPONENT_AT_MUZZLE_05` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_slanted"] = { - label = "Slanted Muzzle", - type = "muzzle", + ['at_muzzle_slanted'] = { + label = 'Slanted Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_06`, + `COMPONENT_AT_MUZZLE_06` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_split"] = { - label = "Split Muzzle", - type = "muzzle", + ['at_muzzle_split'] = { + label = 'Split Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_07`, + `COMPONENT_AT_MUZZLE_07` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_squared"] = { - label = "Squared Muzzle", - type = "muzzle", + ['at_muzzle_squared'] = { + label = 'Squared Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_08`, + `COMPONENT_AT_MUZZLE_08` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_muzzle_bell"] = { - label = "Bell Muzzle", - type = "muzzle", + ['at_muzzle_bell'] = { + label = 'Bell Muzzle', + type = 'muzzle', weight = 80, client = { component = { - `COMPONENT_AT_MUZZLE_09`, + `COMPONENT_AT_MUZZLE_09` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_luxe"] = { - label = "Luxury Weapon Kit", - type = "skin", + ['at_skin_luxe'] = { + label = 'Luxury Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1172,29 +1172,29 @@ return { `COMPONENT_MICROSMG_VARMOD_LUXE`, `COMPONENT_PISTOL_VARMOD_LUXE`, `COMPONENT_PUMPSHOTGUN_VARMOD_LOWRIDER`, - `COMPONENT_SMG_VARMOD_LUXE`, + `COMPONENT_SMG_VARMOD_LUXE` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_wood"] = { - label = "Wood Weapon Kit", - type = "skin", + ['at_skin_wood'] = { + label = 'Wood Weapon Kit', + type = 'skin', weight = 50, client = { component = { `COMPONENT_HEAVYPISTOL_VARMOD_LUXE`, `COMPONENT_SNIPERRIFLE_VARMOD_LUXE`, - `COMPONENT_SNSPISTOL_VARMOD_LOWRIDER`, + `COMPONENT_SNSPISTOL_VARMOD_LOWRIDER` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_metal"] = { - label = "Metal Weapon Kit", - type = "skin", + ['at_skin_metal'] = { + label = 'Metal Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1202,186 +1202,306 @@ return { `COMPONENT_APPISTOL_VARMOD_LUXE`, `COMPONENT_BULLPUPRIFLE_VARMOD_LOW`, `COMPONENT_SAWNOFFSHOTGUN_VARMOD_LUXE`, - `COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER`, + `COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER` + }, + usetime = 2500 + } + }, + + ['at_skin_pearl'] = { + label = 'Pearl Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_PISTOL50_VARMOD_LUXE` + }, + usetime = 2500 + } + }, + + ['at_skin_ballas'] = { + label = 'Ballas Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_BALLAS` + }, + usetime = 2500 + } + }, + + ['at_skin_diamond'] = { + label = 'Diamond Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_DIAMOND` + }, + usetime = 2500 + } + }, + + ['at_skin_dollar'] = { + label = 'Dollar Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_DOLLAR` + }, + usetime = 2500 + } + }, + + ['at_skin_hate'] = { + label = 'Hate Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_HATE` + }, + usetime = 2500 + } + }, + + ['at_skin_king'] = { + label = 'King Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_KING` + }, + usetime = 2500 + } + }, + + ['at_skin_love'] = { + label = 'Love Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_LOVE` + }, + usetime = 2500 + } + }, + + ['at_skin_pimp'] = { + label = 'Pimp Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_PIMP` + }, + usetime = 2500 + } + }, + + ['at_skin_player'] = { + label = 'Player Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_PLAYER` + }, + usetime = 2500 + } + }, + + ['at_skin_vagos'] = { + label = 'Vagos Weapon Kit', + type = 'skin', + weight = 50, + client = { + component = { + `COMPONENT_KNUCKLE_VARMOD_VAGOS` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_pearl"] = { - label = "Pearl Weapon Kit", - type = "skin", + ['at_skin_blagueurs'] = { + label = 'Blagueurs Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_PISTOL50_VARMOD_LUXE`, + `COMPONENT_BAT_VARMOD_XM3` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_ballas"] = { - label = "Ballas Weapon Kit", - type = "skin", + ['at_skin_splatter'] = { + label = 'Splatter Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_BALLAS`, + `COMPONENT_BAT_VARMOD_XM3_01` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_diamond"] = { - label = "Diamond Weapon Kit", - type = "skin", + ['at_skin_bulletholes'] = { + label = 'Bullet Holes Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_DIAMOND`, + `COMPONENT_BAT_VARMOD_XM3_02` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_dollar"] = { - label = "Dollar Weapon Kit", - type = "skin", + ['at_skin_burgershot'] = { + label = 'Burger Shot Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_DOLLAR`, + `COMPONENT_BAT_VARMOD_XM3_03` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_hate"] = { - label = "Hate Weapon Kit", - type = "skin", + ['at_skin_cluckinbell'] = { + label = 'Cluckin Bell Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_HATE`, + `COMPONENT_BAT_VARMOD_XM3_04` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_king"] = { - label = "King Weapon Kit", - type = "skin", + ['at_skin_fatalincursion'] = { + label = 'Fatal Incursion Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_KING`, + `COMPONENT_BAT_VARMOD_XM3_05` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_love"] = { - label = "Love Weapon Kit", - type = "skin", + ['at_skin_luchalibre'] = { + label = 'Lucha Libre Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_LOVE`, + `COMPONENT_BAT_VARMOD_XM3_06` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_pimp"] = { - label = "Pimp Weapon Kit", - type = "skin", + ['at_skin_trippy'] = { + label = 'Trippy Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_PIMP`, + `COMPONENT_BAT_VARMOD_XM3_07` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_player"] = { - label = "Player Weapon Kit", - type = "skin", + ['at_skin_tiedye'] = { + label = 'Tie-Dye Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_PLAYER`, + `COMPONENT_BAT_VARMOD_XM3_08` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_vagos"] = { - label = "Vagos Weapon Kit", - type = "skin", + ['at_skin_wall'] = { + label = 'Wall Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_KNUCKLE_VARMOD_VAGOS`, + `COMPONENT_BAT_VARMOD_XM3_09` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_vip"] = { - label = "VIP Weapon Kit", - type = "skin", + ['at_skin_vip'] = { + label = 'VIP Weapon Kit', + type = 'skin', weight = 50, client = { component = { `COMPONENT_REVOLVER_VARMOD_BOSS`, - `COMPONENT_SWITCHBLADE_VARMOD_VAR1`, + `COMPONENT_SWITCHBLADE_VARMOD_VAR1` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_bodyguard"] = { - label = "Bodyguard Weapon Kit", - type = "skin", + ['at_skin_bodyguard'] = { + label = 'Bodyguard Weapon Kit', + type = 'skin', weight = 50, client = { component = { `COMPONENT_REVOLVER_VARMOD_GOON`, - `COMPONENT_SWITCHBLADE_VARMOD_VAR2`, + `COMPONENT_SWITCHBLADE_VARMOD_VAR2` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_festive"] = { - label = "Festive Weapon Kit", - type = "skin", + ['at_skin_festive'] = { + label = 'Festive Weapon Kit', + type = 'skin', weight = 50, client = { component = { - `COMPONENT_RAYPISTOL_VARMOD_XMAS18`, + `COMPONENT_RAYPISTOL_VARMOD_XMAS18` }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_security"] = { - label = "Security Weapon Kit", - type = "skin", + ['at_skin_security'] = { + label = 'Security Weapon Kit', + type = 'skin', weight = 50, client = { component = { `COMPONENT_APPISTOL_VARMOD_SECURITY`, `COMPONENT_MICROSMG_VARMOD_SECURITY`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_camo"] = { - label = "Camo Weapon Kit", - type = "skin", + ['at_skin_camo'] = { + label = 'Camo Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1398,13 +1518,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO`, `COMPONENT_SPECIALCARBINE_MK2_CAMO`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_brushstroke"] = { - label = "Brushstroke Weapon Kit", - type = "skin", + ['at_skin_brushstroke'] = { + label = 'Brushstroke Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1421,13 +1541,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_02`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_02`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_woodland"] = { - label = "Woodland Weapon Kit", - type = "skin", + ['at_skin_woodland'] = { + label = 'Woodland Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1444,13 +1564,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_03`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_03`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_skull"] = { - label = "Skull Weapon Kit", - type = "skin", + ['at_skin_skull'] = { + label = 'Skull Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1467,13 +1587,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_04`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_04`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_sessanta"] = { - label = "Sessanta Weapon Kit", - type = "skin", + ['at_skin_sessanta'] = { + label = 'Sessanta Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1490,13 +1610,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_05`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_05`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_perseus"] = { - label = "Perseus Weapon Kit", - type = "skin", + ['at_skin_perseus'] = { + label = 'Perseus Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1513,13 +1633,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_06`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_06`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_leopard"] = { - label = "Leopard Weapon Kit", - type = "skin", + ['at_skin_leopard'] = { + label = 'Leopard Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1536,13 +1656,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_07`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_07`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_zebra"] = { - label = "Zebra Weapon Kit", - type = "skin", + ['at_skin_zebra'] = { + label = 'Zebra Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1559,13 +1679,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_08`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_08`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_geometric"] = { - label = "Geometric Weapon Kit", - type = "skin", + ['at_skin_geometric'] = { + label = 'Geometric Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1582,13 +1702,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_09`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_09`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_boom"] = { - label = "Boom Weapon Kit", - type = "skin", + ['at_skin_boom'] = { + label = 'Boom Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1605,13 +1725,13 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_10`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_10`, }, - usetime = 2500, - }, + usetime = 2500 + } }, - ["at_skin_patriotic"] = { - label = "Patriotic Weapon Kit", - type = "skin", + ['at_skin_patriotic'] = { + label = 'Patriotic Weapon Kit', + type = 'skin', weight = 50, client = { component = { @@ -1628,105 +1748,105 @@ return { `COMPONENT_SNSPISTOL_MK2_CAMO_IND_01`, `COMPONENT_SPECIALCARBINE_MK2_CAMO_IND_01`, }, - usetime = 2500, - }, + usetime = 2500 + } }, }, Ammo = { - ["ammo-22"] = { - label = ".22 Long Rifle", + ['ammo-22'] = { + label = '.22 Long Rifle', weight = 3, }, - ["ammo-38"] = { - label = ".38 LC", + ['ammo-38'] = { + label = '.38 LC', weight = 15, }, - ["ammo-44"] = { - label = ".44 Magnum", + ['ammo-44'] = { + label = '.44 Magnum', weight = 16, }, - ["ammo-45"] = { - label = ".45 ACP", + ['ammo-45'] = { + label = '.45 ACP', weight = 15, }, - ["ammo-50"] = { - label = ".50 AE", + ['ammo-50'] = { + label = '.50 AE', weight = 45, }, - ["ammo-9"] = { - label = "9mm", + ['ammo-9'] = { + label = '9mm', weight = 7, }, - ["ammo-firework"] = { - label = "Firework", + ['ammo-firework'] = { + label = 'Firework', weight = 200, }, - ["ammo-flare"] = { - label = "Flare round", + ['ammo-flare'] = { + label = 'Flare round', weight = 38, }, - ["ammo-grenade"] = { - label = "40mm Explosive", + ['ammo-grenade'] = { + label = '40mm Explosive', weight = 400, }, - ["ammo-heavysniper"] = { - label = ".50 BMG", + ['ammo-heavysniper'] = { + label = '.50 BMG', weight = 51, }, - ["ammo-laser"] = { - label = "Laser charge", + ['ammo-laser'] = { + label = 'Laser charge', weight = 1, }, - ["ammo-musket"] = { - label = ".50 Ball", + ['ammo-musket'] = { + label = '.50 Ball', weight = 38, }, - ["ammo-railgun"] = { - label = "Railgun charge", + ['ammo-railgun'] = { + label = 'Railgun charge', weight = 150, }, - ["ammo-rifle"] = { - label = "5.56x45", + ['ammo-rifle'] = { + label = '5.56x45', weight = 4, }, - ["ammo-rifle2"] = { - label = "7.62x39", + ['ammo-rifle2'] = { + label = '7.62x39', weight = 8, }, - ["ammo-rocket"] = { - label = "Rocket", + ['ammo-rocket'] = { + label = 'Rocket', weight = 500, }, - ["ammo-shotgun"] = { - label = "12 Gauge", + ['ammo-shotgun'] = { + label = '12 Gauge', weight = 38, }, - ["ammo-sniper"] = { - label = "7.62x51", + ['ammo-sniper'] = { + label = '7.62x51', weight = 9, }, - ["ammo-emp"] = { - label = "EMP round", + ['ammo-emp'] = { + label = 'EMP round', weight = 400, }, - }, + } } diff --git a/server-data/resources/[ox]/ox_inventory/fxmanifest.lua b/server-data/resources/[ox]/ox_inventory/fxmanifest.lua index 888990281..ed529244f 100644 --- a/server-data/resources/[ox]/ox_inventory/fxmanifest.lua +++ b/server-data/resources/[ox]/ox_inventory/fxmanifest.lua @@ -1,48 +1,47 @@ ---[[ FX Information ]] --- -fx_version("cerulean") -use_experimental_fxv2_oal("yes") -lua54("yes") -game("gta5") +fx_version 'cerulean' +use_experimental_fxv2_oal 'yes' +lua54 'yes' +game 'gta5' +name 'ox_inventory' +author 'Overextended' +version '2.38.1' +repository 'https://github.com/overextended/ox_inventory' +description 'Slot-based inventory with item metadata support' ---[[ Resource Information ]] --- -name("ox_inventory") -author("Overextended") -version("2.30.0") -repository("https://github.com/overextended/ox_inventory") -description("Slot-based inventory with item metadata support") +dependencies { + '/server:6116', + '/onesync', + 'oxmysql', + 'ox_lib', +} ---[[ Manifest ]] --- -dependencies({ - "/server:6116", - "/onesync", - "oxmysql", - "ox_lib", -}) +shared_script '@ox_lib/init.lua' -shared_script("@ox_lib/init.lua") +ox_libs { + 'locale', + 'table', + 'math', +} -server_scripts({ - "@oxmysql/lib/MySQL.lua", - "init.lua", -}) +server_scripts { + '@oxmysql/lib/MySQL.lua', + 'init.lua' +} -client_script("init.lua") +client_script 'init.lua' -ui_page("web/build/index.html") +ui_page 'web/build/index.html' -files({ - "client.lua", - "server.lua", - "locales/*.json", - "web/build/index.html", - "web/build/assets/*.js", - "web/build/assets/*.css", - "web/images/*.png", - "modules/**/shared.lua", - "modules/**/client.lua", - "modules/bridge/**/client.lua", - "data/*.lua", -}) +files { + 'client.lua', + 'server.lua', + 'locales/*.json', + 'web/build/index.html', + 'web/build/assets/*.js', + 'web/build/assets/*.css', + 'web/images/*.png', + 'modules/**/shared.lua', + 'modules/**/client.lua', + 'modules/bridge/**/client.lua', + 'data/*.lua', +} diff --git a/server-data/resources/[ox]/ox_inventory/init.lua b/server-data/resources/[ox]/ox_inventory/init.lua index beacf0557..6e4f2b039 100644 --- a/server-data/resources/[ox]/ox_inventory/init.lua +++ b/server-data/resources/[ox]/ox_inventory/init.lua @@ -1,41 +1,49 @@ -lib.locale() +local function addDeferral(err) + err = err:gsub("%^%d", "") --- Don't be an idiot and change these convar getters (yes, people do that). --- https://overextended.github.io/docs/ox_inventory/Getting%20Started/config + AddEventHandler('playerConnecting', function(_, _, deferrals) + deferrals.defer() + deferrals.done(err) + end) +end + +-- Do not modify this file at all. This isn't a "config" file. You want to change +-- resource settings? Use convars like you were told in the documentation. +-- You did read the docs, right? Probably not, if you're here. +-- https://overextended.dev/ox_inventory#config shared = { - resource = GetCurrentResourceName(), - framework = GetConvar("inventory:framework", "esx"), - playerslots = GetConvarInt("inventory:slots", 50), - playerweight = GetConvarInt("inventory:weight", 30000), - target = GetConvarInt("inventory:target", 0) == 1, - police = json.decode(GetConvar("inventory:police", '["police", "sheriff"]')), + resource = GetCurrentResourceName(), + framework = GetConvar('inventory:framework', 'esx'), + playerslots = GetConvarInt('inventory:slots', 50), + playerweight = GetConvarInt('inventory:weight', 30000), + target = GetConvarInt('inventory:target', 0) == 1, + police = json.decode(GetConvar('inventory:police', '["police", "sheriff"]')), } do - if type(shared.police) == "string" then - shared.police = { shared.police } - end + if type(shared.police) == 'string' then + shared.police = { shared.police } + end - local police = table.create(0, shared.police and #shared.police or 0) + local police = table.create(0, shared.police and #shared.police or 0) - for i = 1, #shared.police do - police[shared.police[i]] = 0 - end + for i = 1, #shared.police do + police[shared.police[i]] = 0 + end - shared.police = police + shared.police = police end if IsDuplicityVersion() then - server = { - loglevel = GetConvarInt("inventory:loglevel", 1), - randomprices = GetConvarInt("inventory:randomprices", 0) == 1, - randomloot = GetConvarInt("inventory:randomloot", 1) == 1, - evidencegrade = GetConvarInt("inventory:evidencegrade", 2), - trimplate = GetConvarInt("inventory:trimplate", 1) == 1, - vehicleloot = json.decode(GetConvar( - "inventory:vehicleloot", - [[ + server = { + bulkstashsave = GetConvarInt('inventory:bulkstashsave', 1) == 1, + loglevel = GetConvarInt('inventory:loglevel', 1), + randomprices = GetConvarInt('inventory:randomprices', 0) == 1, + randomloot = GetConvarInt('inventory:randomloot', 1) == 1, + evidencegrade = GetConvarInt('inventory:evidencegrade', 2), + trimplate = GetConvarInt('inventory:trimplate', 1) == 1, + vehicleloot = json.decode(GetConvar('inventory:vehicleloot', [[ [ ["cola", 1, 1], ["water", 1, 1], @@ -45,60 +53,61 @@ if IsDuplicityVersion() then ["money", 200, 400, 5], ["bandage", 1, 1] ] - ]] - )), - dumpsterloot = json.decode(GetConvar( - "inventory:dumpsterloot", - [[ + ]])), + dumpsterloot = json.decode(GetConvar('inventory:dumpsterloot', [[ [ ["mustard", 1, 1], ["garbage", 1, 3], ["money", 1, 10], ["burger", 1, 1] ] - ]] - )), - } + ]])), + } + + local accounts = json.decode(GetConvar('inventory:accounts', '["money"]')) + server.accounts = table.create(0, #accounts) + + for i = 1, #accounts do + server.accounts[accounts[i]] = 0 + end else - PlayerData = {} - client = { - autoreload = GetConvarInt("inventory:autoreload", 0) == 1, - screenblur = GetConvarInt("inventory:screenblur", 1) == 1, - keys = json.decode(GetConvar("inventory:keys", "")) or { "F2", "K", "TAB" }, - enablekeys = json.decode(GetConvar("inventory:enablekeys", "[249]")), - aimedfiring = GetConvarInt("inventory:aimedfiring", 0) == 1, - giveplayerlist = GetConvarInt("inventory:giveplayerlist", 0) == 1, - weaponanims = GetConvarInt("inventory:weaponanims", 1) == 1, - itemnotify = GetConvarInt("inventory:itemnotify", 1) == 1, - imagepath = GetConvar("inventory:imagepath", "nui://ox_inventory/web/images"), - dropprops = GetConvarInt("inventory:dropprops", 0) == 1, - dropmodel = joaat(GetConvar("inventory:dropmodel", "prop_med_bag_01b")), - weaponmismatch = GetConvarInt("inventory:weaponmismatch", 1) == 1, - ignoreweapons = json.decode(GetConvar("inventory:ignoreweapons", "[]")), - suppresspickups = GetConvarInt("inventory:suppresspickups", 1) == 1, - } - - local ignoreweapons = table.create(0, (client.ignoreweapons and #client.ignoreweapons or 0) + 3) - - for i = 1, #client.ignoreweapons do - local weapon = client.ignoreweapons[i] - ignoreweapons[tonumber(weapon) or joaat(weapon)] = true - end - - ignoreweapons[`WEAPON_UNARMED`] = true - ignoreweapons[`WEAPON_HANDCUFFS`] = true - ignoreweapons[`WEAPON_GARBAGEBAG`] = true - - client.ignoreweapons = ignoreweapons + PlayerData = {} + client = { + autoreload = GetConvarInt('inventory:autoreload', 0) == 1, + screenblur = GetConvarInt('inventory:screenblur', 1) == 1, + keys = json.decode(GetConvar('inventory:keys', '')) or { 'F2', 'K', 'TAB' }, + enablekeys = json.decode(GetConvar('inventory:enablekeys', '[249]')), + aimedfiring = GetConvarInt('inventory:aimedfiring', 0) == 1, + giveplayerlist = GetConvarInt('inventory:giveplayerlist', 0) == 1, + weaponanims = GetConvarInt('inventory:weaponanims', 1) == 1, + itemnotify = GetConvarInt('inventory:itemnotify', 1) == 1, + imagepath = GetConvar('inventory:imagepath', 'nui://ox_inventory/web/images'), + dropprops = GetConvarInt('inventory:dropprops', 0) == 1, + dropmodel = joaat(GetConvar('inventory:dropmodel', 'prop_med_bag_01b')), + weaponmismatch = GetConvarInt('inventory:weaponmismatch', 1) == 1, + ignoreweapons = json.decode(GetConvar('inventory:ignoreweapons', '[]')), + suppresspickups = GetConvarInt('inventory:suppresspickups', 1) == 1, + } + + local ignoreweapons = table.create(0, (client.ignoreweapons and #client.ignoreweapons or 0) + 3) + + for i = 1, #client.ignoreweapons do + local weapon = client.ignoreweapons[i] + ignoreweapons[tonumber(weapon) or joaat(weapon)] = true + end + + ignoreweapons[`WEAPON_UNARMED`] = true + ignoreweapons[`WEAPON_HANDCUFFS`] = true + ignoreweapons[`WEAPON_GARBAGEBAG`] = true + ignoreweapons[`OBJECT`] = true + ignoreweapons[`WEAPON_HOSE`] = true + + client.ignoreweapons = ignoreweapons end -function shared.print(...) - print(string.strjoin(" ", ...)) -end +function shared.print(...) print(string.strjoin(' ', ...)) end -function shared.info(...) - shared.print("^2[info]^7", ...) -end +function shared.info(...) shared.print('^2[info]^7', ...) end ---Throws a formatted type error. ---```lua @@ -108,104 +117,79 @@ end ---@param expected string ---@param received string function TypeError(variable, expected, received) - error(("expected %s to have type '%s' (received %s)"):format(variable, expected, received)) + error(("expected %s to have type '%s' (received %s)"):format(variable, expected, received)) end -- People like ignoring errors for some reason local function spamError(err) - lib = nil - shared.ready = false - CreateThread(function() - while true do - Wait(2000) - CreateThread(function() - error(err, 0) - end) - end - end) - error(err, 0) + shared.ready = false + + CreateThread(function() + while true do + Wait(10000) + CreateThread(function() + error(err, 0) + end) + end + end) + + addDeferral(err) + error(err, 0) end -CreateThread(function() - if shared.framework == "ox" then - local file = ("imports/%s.lua"):format(lib.context) - local import = LoadResourceFile("ox_core", file) - local func, err = load(import, ("@@ox_core/%s"):format(file)) +---@param name string +---@return table +---@deprecated +function data(name) + if shared.server and shared.ready == nil then return {} end + local file = ('data/%s.lua'):format(name) + local datafile = LoadResourceFile(shared.resource, file) + local path = ('@@%s/%s'):format(shared.resource, file) - if not func or err then - shared.ready = false - return spamError(err) - end + if not datafile then + warn(('no datafile found at path %s'):format(path:gsub('@@', ''))) + return {} + end - func() + local func, err = load(datafile, path) - Ox = Ox or {} - end -end) + if not func or err then + shared.ready = false + ---@diagnostic disable-next-line: return-type-mismatch + return spamError(err) + end ----@param name string ----@return table -function data(name) - if shared.server and shared.ready == nil then - return {} - end - local file = ("data/%s.lua"):format(name) - local datafile = LoadResourceFile(shared.resource, file) - local path = ("@@%s/%s"):format(shared.resource, file) - - if not datafile then - warn(("no datafile found at path %s"):format(path:gsub("@@", ""))) - return {} - end - - local func, err = load(datafile, path) - - if not func or err then - shared.ready = false - ---@diagnostic disable-next-line: return-type-mismatch - return spamError(err) - end - - return func() + return func() end if not lib then - return spamError("ox_inventory requires the ox_lib resource, refer to the documentation.") + return spamError('ox_inventory requires the ox_lib resource, refer to the documentation.') end -local success, msg = lib.checkDependency("oxmysql", "2.4.0") +local success, msg = lib.checkDependency('oxmysql', '2.7.3') -if not success then - return spamError(msg) +if success then + success, msg = lib.checkDependency('ox_lib', '3.13.0') end -success, msg = lib.checkDependency("ox_lib", "3.2.0") - if not success then - spamError(msg) + return spamError(msg) end -if not LoadResourceFile(shared.resource, "web/build/index.html") then - return spamError( - "UI has not been built, refer to the documentation or download a release build.\n ^3https://overextended.github.io/docs/ox_inventory/^0" - ) +if not LoadResourceFile(shared.resource, 'web/build/index.html') then + return spamError( + 'UI has not been built, refer to the documentation or download a release build.\n ^3https://overextended.dev/ox_inventory^0') end -if shared.target then - local ox_target = GetResourceState("ox_target"):find("start") - local qtarget = GetResourceState("qtarget"):find("start") - - if not ox_target and not qtarget then - shared.target = false - warn("targeting resource is not loaded - it should start before ox_inventory") - else - shared.target = ox_target and "ox_target" or "qtarget" - end +-- No we're not going to support qtarget any longer. +if shared.target and GetResourceState('ox_target') ~= 'started' then + shared.target = false + warn('ox_target is not loaded - it should start before ox_inventory') end -if lib.context == "server" then - shared.ready = false - return require("server") +if lib.context == 'server' then + shared.ready = false + return require 'server' end -require("client") +require 'client' diff --git a/server-data/resources/[ox]/ox_inventory/locales/ar.json b/server-data/resources/[ox]/ox_inventory/locales/ar.json index bcada80f6..ce916ec9c 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/ar.json +++ b/server-data/resources/[ox]/ox_inventory/locales/ar.json @@ -82,4 +82,4 @@ "cannot_give": "غير قادر على الاعطاء", "evidence_cannot_take": "ليس درجة عالية بما فيه الكفاية لاتخاذ من الأدلة", "dumpster": "القمامة" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/cs.json b/server-data/resources/[ox]/ox_inventory/locales/cs.json index 5b1835667..55eb79280 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/cs.json +++ b/server-data/resources/[ox]/ox_inventory/locales/cs.json @@ -81,5 +81,7 @@ "no_durability": "Předmět je rozbitý", "cannot_give": "Této osobě nemůžete dát %s %s", "evidence_cannot_take": "Nejste dostatečně kvalifikovaný pro přístup", - "dumpster": "Popelnice" -} \ No newline at end of file + "dumpster": "Popelnice", + "crafting_item": "Vyrábíš %s", + "crafting_bench": "Pracovní stůl" +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/da.json b/server-data/resources/[ox]/ox_inventory/locales/da.json index a007aed51..a2406a594 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/da.json +++ b/server-data/resources/[ox]/ox_inventory/locales/da.json @@ -82,4 +82,4 @@ "cannot_give": "Kan ikke give %s %s til person", "evidence_cannot_take": "Ikke høj nok rangering til at tage bevismateriale", "dumpster": "Skraldespand" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/de.json b/server-data/resources/[ox]/ox_inventory/locales/de.json index 537971373..a5654fe17 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/de.json +++ b/server-data/resources/[ox]/ox_inventory/locales/de.json @@ -17,6 +17,8 @@ "ui_ctrl_shift_lmb": "Bewege einen halben Stapel in ein anderes Inventar", "ui_alt_lmb": "Benutze einen Gegenstand", "ui_ctrl_c": "Wenn du über eine Waffe gehst, kopierst du die Seriennummer", + "ui_remove_ammo": "Entferne Munition", + "ammo_type": "Munitionstyp", "$": "$", "male": "Männlich", "female": "Weiblich", @@ -46,6 +48,7 @@ "buy_amount": "Trage die Anzahl ein die du kaufen möchtest", "component_has": "Diese Waffe hat bereits ein/e %s", "component_invalid": "Diese Waffe ist nicht kompatibel mit einem %s", + "component_slot_occupied" : "Der %s Slot dieser Waffe ist bereits belegt", "cannot_perform": "Du kannst diese Aktion nicht ausführen", "cannot_carry": "Du kannst nicht so viel tragen", "cannot_carry_other": "Das Inventar hat nicht genügend Platz", @@ -82,5 +85,9 @@ "cannot_give": "%s %s kann nicht übergeben werden", "evidence_cannot_take": "Dein Rang ist hierfür zu niedrig", "dumpster": "Mülleimer", - "not_enough_durability": "Haltbarkeit von %s reicht nicht mehr aus" -} \ No newline at end of file + "crafting_item": "%s herstellen", + "crafting_bench": "Werkbank", + "open_crafting_bench": "Werkbank öffnen", + "not_enough_durability": "Haltbarkeit von %s reicht nicht mehr aus", + "storage": "Kofferraum" +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/el.json b/server-data/resources/[ox]/ox_inventory/locales/el.json index 74aeea444..5c49c518e 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/el.json +++ b/server-data/resources/[ox]/ox_inventory/locales/el.json @@ -82,4 +82,4 @@ "cannot_give": "Δεν μπορείς να δώσεις %s %s στον στόχο σου", "evidence_cannot_take": "Όχι αρκετά υψηλός βαθμός για να πάρετε αντικέιμενα από τα στοιχεία", "dumpster": "Κάδος Σκουπιδιών" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/en.json b/server-data/resources/[ox]/ox_inventory/locales/en.json index 897712de8..1e9c0e8a5 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/en.json +++ b/server-data/resources/[ox]/ox_inventory/locales/en.json @@ -85,5 +85,9 @@ "cannot_give": "Unable to give %s %s to the target", "evidence_cannot_take": "You are not authorised to withdraw evidence", "dumpster": "Dumpster", - "not_enough_durability": "%s does not have enough durability" -} \ No newline at end of file + "crafting_item": "Crafting %s", + "crafting_bench": "Crafting Bench", + "open_crafting_bench": "Open Crafting Bench", + "not_enough_durability": "%s does not have enough durability", + "storage": "Storage" +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/es.json b/server-data/resources/[ox]/ox_inventory/locales/es.json index 36e715ea0..bfd34e9c4 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/es.json +++ b/server-data/resources/[ox]/ox_inventory/locales/es.json @@ -84,5 +84,8 @@ "cannot_give": "No se puede dar %s %s al objetivo", "evidence_cannot_take": "No estás autorizado a retirar pruebas", "dumpster": "Contenedor de basura", + "crafting_item": "Creando %s", + "crafting_bench": "Banco de trabajo", + "open_crafting_bench": "Abrir banco de trabajo", "not_enough_durability": "%s no tiene suficiente durabilidad" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/et.json b/server-data/resources/[ox]/ox_inventory/locales/et.json index 6924092d3..d4e904581 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/et.json +++ b/server-data/resources/[ox]/ox_inventory/locales/et.json @@ -82,4 +82,4 @@ "cannot_give": "%s %s ei saa sihtmärgile anda", "evidence_cannot_take": "Pole piisavalt kõrge auaste, et tõendite põhjal võtta", "dumpster": "Prügikast" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/fi.json b/server-data/resources/[ox]/ox_inventory/locales/fi.json index a53bc85fd..2b197a199 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/fi.json +++ b/server-data/resources/[ox]/ox_inventory/locales/fi.json @@ -85,5 +85,8 @@ "cannot_give": "Ei voida antaa %s %s kohteelle", "evidence_cannot_take": "Et ole tarpeeksi korkea-arvoinen, että voisit ottaa tavaraa todistusaineista", "dumpster": "Roskis", + "crafting_item": "Valmistetaan %s", + "crafting_bench": "Työkalupenkki", + "open_crafting_bench": "Avaa työkalupenkki", "not_enough_durability": "%s on liian huonossa kunnossa" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/fr.json b/server-data/resources/[ox]/ox_inventory/locales/fr.json index f6be8d81d..7469d2f6b 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/fr.json +++ b/server-data/resources/[ox]/ox_inventory/locales/fr.json @@ -85,5 +85,8 @@ "cannot_give": "Impossible de donner %s %s à cet inventaire", "evidence_cannot_take": "Votre grade ne vous permet pas de récupérer des preuves", "dumpster": "Poubelle", + "crafting_item": "Fabrication %s", + "crafting_bench": "Table de fabrication", + "open_crafting_bench": "Ouvrir la table de fabrication", "not_enough_durability": "%s n'a pas assez de durabilité" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/hr.json b/server-data/resources/[ox]/ox_inventory/locales/hr.json index 822e6bfe6..65110e34e 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/hr.json +++ b/server-data/resources/[ox]/ox_inventory/locales/hr.json @@ -82,4 +82,4 @@ "cannot_give": "Nije moguće dati %s %s cilju", "evidence_cannot_take": "Nisi autoriziran za ovo", "dumpster": "Kontejner" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/hu.json b/server-data/resources/[ox]/ox_inventory/locales/hu.json index ca6bc0454..97ae60a61 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/hu.json +++ b/server-data/resources/[ox]/ox_inventory/locales/hu.json @@ -17,6 +17,8 @@ "ui_ctrl_shift_lmb": "Fél mennyiség áthelyezése másik inventory-ba", "ui_alt_lmb": "Tárgy gyorshasználat", "ui_ctrl_c": "Kurzor alatt lévő fegyver sorozatszámának másolása", + "ui_remove_ammo": "Lőszer eltávolítása", + "ammo_type": "Lőszer típusa", "$": "$", "male": "Férfi", "female": "Nő", @@ -31,7 +33,7 @@ "inventory_right_access": "Ezt az inventory-t nem tudod megnyitni.", "inventory_lost_access": "Már nem férsz hozzá ehhez az inventoryhoz", "wrong_ammo": "Nem töltheted be %s-t ezzel %s lőszer", - "weapon_license": "Fegyver Engedély", + "license": "%s Engedély", "already_have": "Neked már van fegyver engedélyed!", "have_purchased": "Vettél egy fegyver engedélyt", "can_not_afford": "Nem engedheted meg magadnak a fegyver engedélyt", @@ -46,6 +48,7 @@ "buy_amount": "Meg kell adnod a mennyiséget a vásárláshoz", "component_has": "Ennek a fegyvernek már van: %s", "component_invalid": "Ez a fegyver nem kompatibilis ezzel: %s", + "component_slot_occupied": "Ennek a fegyvernek a %s helye már foglalt", "cannot_perform": "Ezt a műveletet nem hajthatod végre", "cannot_carry": "Ennyit nem cipelhetsz", "cannot_carry_other": "A cél inventory nem tud ennyit tárolni", @@ -82,5 +85,7 @@ "cannot_give": "%s %s nem adható meg a célnak", "evidence_cannot_take": "Nem elég magas a rangod a bizonyítékok kezeléséhez", "dumpster": "Szemetes", + "crafting_item": "%s barkácsolása ", + "crafting_bench": "Barkácsasztal", "not_enough_durability": "%s elhasználodott!" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/id.json b/server-data/resources/[ox]/ox_inventory/locales/id.json index 27171a6dd..9ac4f3a03 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/id.json +++ b/server-data/resources/[ox]/ox_inventory/locales/id.json @@ -82,5 +82,7 @@ "cannot_give": "Tidak dapat memberikan %s %s ke target", "evidence_cannot_take": "Anda tidak berwenang untuk mengambil barang bukti", "dumpster": "Tempat Sampah", + "crafting_item": "Membuat %s", + "crafting_bench": "Bangku Kerajinan", "not_enough_durability": "%s tidak memiliki daya tahan yang cukup" -} \ No newline at end of file +} diff --git a/server-data/resources/[ox]/ox_inventory/locales/it.json b/server-data/resources/[ox]/ox_inventory/locales/it.json index a42ef5a5d..6897ee2dd 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/it.json +++ b/server-data/resources/[ox]/ox_inventory/locales/it.json @@ -43,7 +43,7 @@ "vehicle_locked": "Il veicolo è chiuso", "nobody_nearby": "Nessuno nelle vicinanze", "give_amount": "Devi inserire la quantità da dare", - "buy_amount": "Devi inserire la quantità da acquistare", + "buy_amount": "Devi inserire la quantitò da acquistare", "component_has": "Quest'arma ha già %s", "component_invalid": "Quest'arma non può montare %s", "cannot_perform": "Non puoi eseguire questa azione", @@ -82,5 +82,7 @@ "cannot_give": "Impossibile dare %s %s al giocatore selezionato", "evidence_cannot_take": "Il tuo grado non può prendere oggetti dal deposito", "dumpster": "Cassonetto", + "crafting_item": "Craftando %s", + "crafting_bench": "Banco da lavoro", "not_enough_durability": "%s non ha abbastanza durabilità" } diff --git a/server-data/resources/[ox]/ox_inventory/locales/lt.json b/server-data/resources/[ox]/ox_inventory/locales/lt.json index b86a97e04..8f59475fc 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/lt.json +++ b/server-data/resources/[ox]/ox_inventory/locales/lt.json @@ -84,5 +84,8 @@ "cannot_give": "Nepavyko paduoti %s %s", "evidence_cannot_take": "Tau neleidžiama paimti įkalčių", "dumpster": "Konteineris", +"crafting_item": "Gaminti %s", +"crafting_bench": "Gamybos Stalas", +"open_crafting_bench": "Atidaryti Gamybos Stalą", "not_enough_durability": "%s nėra pakankamai patvarus" } diff --git a/server-data/resources/[ox]/ox_inventory/locales/nl.json b/server-data/resources/[ox]/ox_inventory/locales/nl.json index 03e8ca5db..e6fb57bc5 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/nl.json +++ b/server-data/resources/[ox]/ox_inventory/locales/nl.json @@ -82,5 +82,8 @@ "cannot_give": "Niet in staat om %s %s te geven aan het doel", "evidence_cannot_take": "Je rang is niet hoog genoeg om van de bewijskluis te pakken", "dumpster": "Afvalcontainer", + "crafting_item": "%s aan het maken", + "crafting_bench": "Werkbank", + "open_crafting_bench": "Open Werkbank", "not_enough_durability": "%s heeft niet genoeg levensduur." } diff --git a/server-data/resources/[ox]/ox_inventory/locales/no.json b/server-data/resources/[ox]/ox_inventory/locales/no.json index ff793987c..0e6ff1f07 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/no.json +++ b/server-data/resources/[ox]/ox_inventory/locales/no.json @@ -85,6 +85,9 @@ "cannot_give": "Kan ikke gi %s %s til målet", "evidence_cannot_take": "Du er ikke autorisert til å trekke ut bevis", "dumpster": "Søppelkasse", + "crafting_item": "Lager %s", + "crafting_bench": "Lagebenk", + "open_crafting_bench": "Åpne lagebenk", "not_enough_durability": "%s har ikke nok holdbarhet" -} + } \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/locales/pl.json b/server-data/resources/[ox]/ox_inventory/locales/pl.json index 3922e352b..04d35d05d 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/pl.json +++ b/server-data/resources/[ox]/ox_inventory/locales/pl.json @@ -85,5 +85,8 @@ "cannot_give": "Nie można przekazać %s %s", "evidence_cannot_take": "Nie posiadasz autoryzacji do zabrania dowodu", "dumpster": "Śmietnik", + "crafting_item": "Wytwórz %s", + "crafting_bench": "Stół do wytwarzania", + "open_crafting_bench": "Otwórz stół do wytwarzania", "not_enough_durability": "%s nie posiada wystarczjąco wytrzymałości" } diff --git a/server-data/resources/[ox]/ox_inventory/locales/sr.json b/server-data/resources/[ox]/ox_inventory/locales/sr.json index 31c383d71..cca9e20b2 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/sr.json +++ b/server-data/resources/[ox]/ox_inventory/locales/sr.json @@ -86,5 +86,8 @@ "cannot_give": "Nemoguce dati %s %s osobi", "evidence_cannot_take": "Niste autorizovani da uzmete dokaz", "dumpster": "Kontejner", + "crafting_item": "Kraftovanje %s", + "crafting_bench": "Sto za Kraftovanje", + "open_crafting_bench": "Otvori sto za kraftovanje", "not_enough_durability": "%s nema dovoljno izdrzljivosti" } diff --git a/server-data/resources/[ox]/ox_inventory/locales/tr.json b/server-data/resources/[ox]/ox_inventory/locales/tr.json index 43f12a286..480ab86e7 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/tr.json +++ b/server-data/resources/[ox]/ox_inventory/locales/tr.json @@ -13,16 +13,18 @@ "ui_usefulcontrols": "Kontroller", "ui_rmb": "Item Bilgi Menüsünü Aç", "ui_ctrl_lmb": "Itemleri, diğer envantere hızlı aktar", - "ui_shift_drag": "Miktarı ikiye böl", + "ui_shift_drag": "Eşya miktarını ikiye böl", "ui_ctrl_shift_lmb": "Eşyanın yarısını diğer envantere aktar", "ui_alt_lmb": "Hızlı item kullan", "ui_ctrl_c": "Bir silahın üzerine imleci getirdiğinde seri numarasını kopyala", + "ui_remove_ammo": "Mermiyi kaldır", + "ammo_type": "Mermi Tipi", "$": "$", "male": "Erkek", "female": "Kadın", "used": "Kullanıldı", - "ui_removed": "Kaldırılan", - "ui_added": "Eklenen", + "ui_removed": "Silindi", + "ui_added": "Eklendi", "ui_holstered": "Kılıfta", "ui_equipped": "Kuşanıldı", "using": "%s Kullanıyorsun", @@ -31,12 +33,12 @@ "inventory_right_access": "Bu envanteri açamazsınız", "inventory_lost_access": "Bu envanter artık erişilemez durumda", "wrong_ammo": "%s silahına %s mermisi dolduramazsınız", - "weapon_license": "Silah lisansı", + "license": "%s Lisansı", "already_have": "Zaten bir silah lisansına sahipsiniz", "have_purchased": "Bir silah lisansı satın aldınız", - "can_not_afford": "Silah lisansı alamazsınız", - "purchase_license": "Lisansı satın al", - "interact_prompt": "Interact with [%s]", + "can_not_afford": "%s satın alamazsınız.", + "purchase_license": "%s lisansı satın al", + "interact_prompt": "[%s] ile etkileşime geç", "weapon_unregistered": "%s kimseye kayıtlı değil", "weapon_registered": "%s (%s), %s kişisine kayıtlı", "weapon_broken": "Silah kırık", @@ -46,7 +48,8 @@ "buy_amount": "Satın alabilmek için bir miktar girmelisiniz", "component_has": "Bu silah zaten %s uzantısına sahip", "component_invalid": "%s uzantısı bu silah için uygun değil", - "cannot_perform": "Bu eylemi gerçekleştiremezsiniz", + "component_slot_occupied": "Bu silahın %s yuvası zaten dolu", + "cannot_perform": "Bu işlemi gerçekleştiremezsiniz.", "cannot_carry": "Daha çoğunu taşıyamazsınız", "cannot_carry_other": "Diğer envanter daha çoğunu taşıyamaz", "cannot_carry_limit": "Daha fazla %s %s taşıyamazsınız", @@ -82,5 +85,8 @@ "cannot_give": "Hedefe %s %s verilmedi", "evidence_cannot_take": "Kanıtlara erişebilmek için yeterli rütbede değilsiniz", "dumpster": "Çöplük", + "crafting_item": "Üretiliyor %s", + "crafting_bench": "Üretim Tezgahı", + "open_crafting_bench": "Üretim Tezgahını Aç", "not_enough_durability": "%s Yeterli dayanıklılığa sahip değil" } diff --git a/server-data/resources/[ox]/ox_inventory/locales/zh-cn.json b/server-data/resources/[ox]/ox_inventory/locales/zh-cn.json index 8d5b27784..f1c88c0a2 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/zh-cn.json +++ b/server-data/resources/[ox]/ox_inventory/locales/zh-cn.json @@ -12,9 +12,9 @@ "ui_tint": "色调", "ui_usefulcontrols": "实用控件", "ui_rmb": "打开物品菜单", - "ui_ctrl_lmb": "快速将一堆物品移动到另一个库存中", + "ui_ctrl_lmb": "快速将一堆物品移动到另一个物品栏中", "ui_shift_drag": "将项目数量分成两份", - "ui_ctrl_shift_lmb": "快速将一半物品移动到另一个库存中", + "ui_ctrl_shift_lmb": "快速将一半物品移动到另一个物品栏中", "ui_alt_lmb": "快速使用物品", "ui_ctrl_c": "当悬停在武器上时,复制其序列号", "ui_remove_ammo": "移除弹药", @@ -28,15 +28,15 @@ "ui_holstered": "已收回", "ui_equipped": "已装备", "using": "使用 %s", - "inventory_setup": "库存已准备好使用", - "inventory_player_access": "你现在无法打开库存", - "inventory_right_access": "你无法打开此库存", - "inventory_lost_access": "无法再访问此库存", - "wrong_ammo": "你不能用 %s 弹药加载 %s", + "inventory_setup": "物品栏已就绪", + "inventory_player_access": "您现在无法打开物品栏", + "inventory_right_access": "您无法打开此物品栏", + "inventory_lost_access": "无法再访问此物品栏", + "wrong_ammo": "您不能用 %s 弹药加载 %s", "license": "%s 许可证", - "already_have": "你已经拥有 %s 许可证", - "have_purchased": "你已购买 %s 许可证", - "can_not_afford": "你买不起 %s 许可证", + "already_have": "您已经拥有 %s 许可证", + "have_purchased": "您已购买 %s 许可证", + "can_not_afford": "您买不起 %s 许可证", "purchase_license": "购买 %s 许可证", "interact_prompt": "[%s] 进行交互", "weapon_unregistered": "%s 未向任何人注册", @@ -44,46 +44,50 @@ "weapon_broken": "这武器坏了", "vehicle_locked": "车辆已锁定", "nobody_nearby": "附近没有人", - "give_amount": "你必须输入金额", - "buy_amount": "你必须输入购买金额", + "give_amount": "您必须输入金额", + "buy_amount": "您必须输入购买金额", "component_has": "这把武器已经有了 %s", "component_invalid": "此武器不兼容 %s", "component_slot_occupied": "该武器的 %s 插槽已被占用", - "cannot_perform": "你无法执行此操作", - "cannot_carry": "你不能带那么多", - "cannot_carry_other": "目标库存不能容纳那么多", - "cannot_carry_limit": "你不能携带超过 %s %s", + "cannot_perform": "您无法执行此操作", + "cannot_carry": "您不能带那么多", + "cannot_carry_other": "目标物品栏不能容纳这些物品", + "cannot_carry_limit": "您不能携带超过 %s %s", "cannot_carry_limit_other": "目标不能携带超过 %s %s", - "items_confiscated": "你的物品已被没收", - "items_returned": "你的物品已被退回", - "item_unauthorised": "你无权购买此商品", - "item_unlicensed": "你无权购买此商品", - "item_not_enough": "你没有足够的 %s", - "cannot_afford": "你买不起 (丢失 %s)", - "stash_lowgrade": "你无权携带此物品", + "items_confiscated": "您的物品已被没收", + "items_returned": "您的物品已被退回", + "item_unauthorised": "您无权购买此商品", + "item_unlicensed": "您无权购买此商品", + "item_not_enough": "您没有足够的 %s", + "cannot_afford": "您买不起 (需要 %s)", + "stash_lowgrade": "您无权携带此物品", "cannot_use": "无法使用 %s", "shop_nostock": "商品缺货", "identification": "性别: %s \n出生日期: %s", "search_dumpster": "搜索垃圾箱", "open_label": "打开 %s", "purchased_for": "已购买 %s %s %s%s", - "unable_stack_items": "你无法堆叠这些物品", - "police_evidence": "警方证据", - "open_police_evidence": "打开警方证据", + "unable_stack_items": "您无法堆叠这些物品", + "police_evidence": "警方物证仓库", + "open_police_evidence": "打开警方物证仓库", "open_stash": "打开藏匿处", "locker_number": "储物柜号码", "locker_no_value": "必须包含打开储物柜的号码", - "locker_must_number": "储物柜必须是数字", - "weapon_hand_required": "你手上必须有武器", + "locker_must_number": "储物柜号码必须是数字", + "weapon_hand_required": "您手上必须有武器", "weapon_hand_wrong": "拿错了武器", - "open_player_inventory": "打开玩家库存~", - "open_secondary_inventory": "打开二级库存~", - "disable_hotbar": "显示库存快捷栏~", + "open_player_inventory": "打开玩家物品栏~", + "open_secondary_inventory": "打开二级物品栏~", + "disable_hotbar": "显示物品栏快捷栏~", "reload_weapon": "重装武器~", - "use_hotbar": "使用快捷栏项目 %s~", + "use_hotbar": "使用快捷栏 %s~", "no_durability": "%s 耐久已耗尽", "cannot_give": "无法将 %s %s 交给目标", - "evidence_cannot_take": "你无权撤回证据", + "evidence_cannot_take": "您无权撤回证据", "dumpster": "垃圾箱", - "not_enough_durability": "%s 没有足够的耐久度" -} + "crafting_item": "制作 %s", + "crafting_bench": "工作台", + "open_crafting_bench": "打开工作台", + "not_enough_durability": "%s 没有足够的耐久度", + "storage": "储物柜" +} \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/locales/zh-tw.json b/server-data/resources/[ox]/ox_inventory/locales/zh-tw.json index cd6668ee1..bbe58060f 100644 --- a/server-data/resources/[ox]/ox_inventory/locales/zh-tw.json +++ b/server-data/resources/[ox]/ox_inventory/locales/zh-tw.json @@ -85,5 +85,9 @@ "cannot_give": "無法將 %s %s 給予目標 ", "evidence_cannot_take": "階級不夠,無法拿取證物", "dumpster": "垃圾桶", - "not_enough_durability": "%s 沒有足夠的耐久度" + "crafting_item": "製作 %s", + "crafting_bench": "工作台", + "open_crafting_bench": "打開工作台", + "not_enough_durability": "%s 沒有足夠的耐久度", + "storage": "儲櫃" } diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/client.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/client.lua index 449f6524a..2d4d044ac 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/client.lua @@ -1,6 +1,4 @@ -if not lib then - return -end +if not lib then return end ---@diagnostic disable-next-line: duplicate-set-field function client.setPlayerData(key, value) @@ -9,11 +7,9 @@ function client.setPlayerData(key, value) end function client.hasGroup(group) - if not PlayerData.loaded then - return - end + if not PlayerData.loaded then return end - if type(group) == "table" then + if type(group) == 'table' then for name, rank in pairs(group) do local groupRank = PlayerData.groups[name] if groupRank and groupRank >= (rank or 0) then @@ -28,14 +24,12 @@ function client.hasGroup(group) end end -local Shops = require("modules.shops.client") -local Utils = require("modules.utils.client") -local Weapon = require("modules.weapon.client") +local Shops = require 'modules.shops.client' +local Utils = require 'modules.utils.client' +local Weapon = require 'modules.weapon.client' function client.onLogout() - if not PlayerData.loaded then - return - end + if not PlayerData.loaded then return end if client.parachute then Utils.DeleteEntity(client.parachute) @@ -55,24 +49,19 @@ function client.onLogout() client.closeInventory() Shops.wipeShops() - ClearInterval(client.interval) - ClearInterval(client.tick) - Weapon.Disarm() -end -local scriptPath = ("modules/bridge/%s/client.lua"):format(shared.framework) -local resourceFile = LoadResourceFile(cache.resource, scriptPath) + if client.interval then + ClearInterval(client.interval) + ClearInterval(client.tick) + end -if not resourceFile then - lib = nil - return error(("Unable to find framework bridge for '%s'"):format(shared.framework)) + Weapon.Disarm() end -local func, err = load(resourceFile, ("@@%s/%s"):format(cache.resource, scriptPath)) +local success, result = pcall(lib.load, ('modules.bridge.%s.client'):format(shared.framework)) -if not func or err then - lib = nil - return error(err) +if not success then + lib.print.error(result) + lib = nil + return end - -func(client.onLogout) diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/client.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/client.lua index 55639b0e1..3417d343f 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/client.lua @@ -1,12 +1,10 @@ -local onLogout = ... - local ESX = setmetatable({}, { __index = function(self, index) local obj = exports.es_extended:getSharedObject() self.SetPlayerData = obj.SetPlayerData self.PlayerLoaded = obj.PlayerLoaded return self[index] - end, + end }) ---@diagnostic disable-next-line: duplicate-set-field @@ -18,23 +16,17 @@ end ---@diagnostic disable-next-line: duplicate-set-field function client.setPlayerStatus(values) for name, value in pairs(values) do - if value > 0 then - TriggerEvent("esx_status:add", name, value) - else - TriggerEvent("esx_status:remove", name, -value) - end + if value > 0 then TriggerEvent('esx_status:add', name, value) else TriggerEvent('esx_status:remove', name, -value) end end end -RegisterNetEvent("esx:onPlayerLogout", onLogout) +RegisterNetEvent('esx:onPlayerLogout', client.onLogout) -AddEventHandler("esx:setPlayerData", function(key, value) - if not PlayerData.loaded or GetInvokingResource() ~= "es_extended" then - return - end +AddEventHandler('esx:setPlayerData', function(key, value) + if not PlayerData.loaded or GetInvokingResource() ~= 'es_extended' then return end - if key == "job" then - key = "groups" + if key == 'job' then + key = 'groups' value = { [value.name] = value.grade } end @@ -42,20 +34,18 @@ AddEventHandler("esx:setPlayerData", function(key, value) OnPlayerData(key, value) end) -local Weapon = require("modules.weapon.client") +local Weapon = require 'modules.weapon.client' -RegisterNetEvent("esx_policejob:handcuff", function() +RegisterNetEvent('esx_policejob:handcuff', function() PlayerData.cuffed = not PlayerData.cuffed - LocalPlayer.state:set("invBusy", PlayerData.cuffed, false) + LocalPlayer.state:set('invBusy', PlayerData.cuffed, false) - if not PlayerData.cuffed then - return - end + if not PlayerData.cuffed then return end Weapon.Disarm() end) -RegisterNetEvent("esx_policejob:unrestrain", function() +RegisterNetEvent('esx_policejob:unrestrain', function() PlayerData.cuffed = false - LocalPlayer.state:set("invBusy", PlayerData.cuffed, false) + LocalPlayer.state:set('invBusy', PlayerData.cuffed, false) end) diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/server.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/server.lua index ba127ebfa..16fc142bb 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/esx/server.lua @@ -1,12 +1,7 @@ -local playerDropped = ... -local Inventory, Items +local Inventory = require 'modules.inventory.server' +local Items = require 'modules.items.server' -CreateThread(function() - Inventory = require 'modules.inventory.server' - Items = require 'modules.items.server' -end) - -AddEventHandler('esx:playerDropped', playerDropped) +AddEventHandler('esx:playerDropped', server.playerDropped) AddEventHandler('esx:setJob', function(source, job, lastJob) local inventory = Inventory(source) @@ -32,11 +27,7 @@ SetTimeout(500, function() end end) --- Accounts that need to be synced with physical items -server.accounts = { - money = 0, - black_money = 0, -} +server.accounts.black_money = 0 ---@diagnostic disable-next-line: duplicate-set-field function server.setPlayerData(player) @@ -55,16 +46,12 @@ end ---@diagnostic disable-next-line: duplicate-set-field function server.syncInventory(inv) - local money = table.clone(server.accounts) - - for _, v in pairs(inv.items) do - if money[v.name] then - money[v.name] += v.count - end - end + local accounts = Inventory.GetAccountItemCounts(inv) - local player = server.GetPlayerFromId(inv.id) - player.syncInventory(inv.weight, inv.maxWeight, inv.items, money) + if accounts then + local player = server.GetPlayerFromId(inv.id) + player.syncInventory(inv.weight, inv.maxWeight, inv.items, accounts) + end end ---@diagnostic disable-next-line: duplicate-set-field diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/client.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/client.lua index a889d2945..f97ca7a2a 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/client.lua @@ -1,42 +1,48 @@ +if not lib.checkDependency('ND_Core', '2.0.0', true) then return end + +NDCore = {} + +lib.load('@ND_Core.init') + +RegisterNetEvent("ND:characterUnloaded", client.onLogout) + local function reorderGroups(groups) - groups = groups or {} - for group, info in pairs(groups) do - groups[group] = info.rank - end - return groups + groups = groups or {} + for group, info in pairs(groups) do + groups[group] = info.rank + end + return groups end SetTimeout(500, function() - NDCore = exports["ND_Core"]:GetCoreObject() - - local character = NDCore.Functions.GetSelectedCharacter() - if character then - local groups = reorderGroups(character.data.groups) - OnPlayerData("groups", groups) - end + local player = NDCore.getPlayer() + if not player then return end + local groups = reorderGroups(player.groups) + OnPlayerData("groups", groups) end) -RegisterNetEvent("ND:setCharacter", function(character) - local groups = reorderGroups(character.data.groups) - OnPlayerData("groups", groups) +RegisterNetEvent("ND:characterLoaded", function(character) + local groups = reorderGroups(character.groups) + OnPlayerData("groups", groups) end) -RegisterNetEvent("ND:jobChanged", function(job, lastJob) - local character = NDCore.Functions.GetSelectedCharacter() - local groups = reorderGroups(character.data.groups) - groups[lastJob.name] = nil - groups[job.name] = job.rank - - OnPlayerData("groups", groups) +RegisterNetEvent("ND:updateCharacter", function(character) + PlayerData.dead = character.metadata.dead + OnPlayerData("dead", PlayerData.dead) end) ---@diagnostic disable-next-line: duplicate-set-field function client.setPlayerStatus(values) - for name, value in pairs(values) do - if value == 0 then - exports["ND_Status"]:setStatus(name, value) - else - exports["ND_Status"]:changeStatus(name, value) - end - end + if GetResourceState("ND_Status") ~= "started" then return end + + local status = exports["ND_Status"] + + for name, value in pairs(values) do + + if value > 100 or value < -100 then + value = value * 0.0001 + end + + status:changeStatus(name, value) + end end diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/server.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/server.lua index 0a76de132..ddbf8a871 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/nd/server.lua @@ -1,118 +1,87 @@ -local playerDropped = ... -local Inventory -local NDCore +if not lib.checkDependency('ND_Core', '2.0.0', true) then return end -CreateThread(function() - Inventory = require("modules.inventory.server") -end) +local Inventory = require 'modules.inventory.server' +NDCore = {} -AddEventHandler("ND:characterUnloaded", playerDropped) +lib.load('@ND_Core.init') -RegisterNetEvent("ND:jobChanged", function(source, job, lastJob) - local inventory = Inventory(source) - if not inventory then - return - end - inventory.player.groups[lastJob.name] = nil - inventory.player.groups[job.name] = job.rank -end) +AddEventHandler("ND:characterUnloaded", server.playerDropped) local function reorderGroups(groups) - groups = groups or {} - for group, info in pairs(groups) do - groups[group] = info.rank - end - return groups + groups = groups or {} + for group, info in pairs(groups) do + groups[group] = info.rank + end + return groups +end + +local function setCharacterInventory(character) + character.identifier = character.id + character.name = ("%s %s"):format(character.firstname, character.lastname) + character.dateofbirth = character.dob + character.sex = character.gender + character.groups = reorderGroups(character.groups) + server.setPlayerInventory(character, character.inventory) + Inventory.SetItem(character.source, "money", character.cash) end SetTimeout(500, function() - NDCore = exports["ND_Core"]:GetCoreObject() - server.GetPlayerFromId = NDCore.Functions.GetPlayer - for _, character in pairs(NDCore.Functions.GetPlayers()) do - character.identifier = character.id - character.name = ("%s %s"):format(character.firstName, character.lastName) - character.dateofbirth = character.dob - character.sex = character.gender - character.groups = reorderGroups(character.data.groups) - server.setPlayerInventory(character, character.inventory) - Inventory.SetItem(character.source, "money", character.cash) - end + server.GetPlayerFromId = NDCore.getPlayer + for _, character in pairs(NDCore.getPlayers()) do + setCharacterInventory(character) + end end) -- Accounts that need to be synced with physical items server.accounts = { - money = 0, + money = 0 } -RegisterNetEvent("ND:characterLoaded", function(character) - if not character then - return - end - character.identifier = character.id - character.name = ("%s %s"):format(character.firstName, character.lastName) - character.dateofbirth = character.dob - character.sex = character.gender - - local groups = reorderGroups(character.data.groups) - server.setPlayerInventory(character, character.inventory) - Inventory.SetItem(character.source, "money", character.cash) +AddEventHandler("ND:characterLoaded", function(character) + if not character then return end + setCharacterInventory(character) end) -RegisterNetEvent("ND:moneyChange", function(player, account, amount, changeType) - if account ~= "cash" then - return - end - local item = Inventory.GetItem(player, "money", nil, true) - Inventory.SetItem( - player, - "money", - changeType == "set" and amount - or changeType == "remove" and item - amount - or changeType == "add" and item + amount - ) +AddEventHandler("ND:moneyChange", function(src, account, amount, changeType, reason) + if account ~= "cash" then return end + local item = Inventory.GetItem(src, "money", nil, true) + Inventory.SetItem(src, "money", changeType == "set" and amount or changeType == "remove" and item - amount or changeType == "add" and item + amount) end) ---@diagnostic disable-next-line: duplicate-set-field function server.syncInventory(inv) - local money = table.clone(server.accounts) + local accounts = Inventory.GetAccountItemCounts(inv) - for _, v in pairs(inv.items) do - if money[v.name] then - money[v.name] += v.count - end - end - - if money then - local character = NDCore.Functions.GetPlayer(inv.id) - NDCore.Functions.SetPlayerData(character.id, "cash", money.money) - end + if accounts then + local player = NDCore.getPlayer(inv.id) + player.setData("cash", accounts.money) + end end ---@diagnostic disable-next-line: duplicate-set-field function server.setPlayerData(player) - return { - source = player.source, - identifier = player.id, - name = ("%s %s"):format(player.firstName, player.lastName), - groups = player.data.groups, - sex = player.gender, - dateofbirth = player.dob, - job = player.job, - } + return { + source = player.source, + identifier = player.id, + name = ("%s %s"):format(player.firstname, player.lastname), + groups = player.groups, + sex = player.gender, + dateofbirth = player.dob + } end ---@diagnostic disable-next-line: duplicate-set-field function server.hasLicense(inv, license) - local character = NDCore.Functions.GetPlayer(inv.id) - if not character or not character.data.licences then - return - end - - for _, characterLicense in pairs(character.data.licences) do - if characterLicense.type == license and characterLicense.status == "valid" then - return characterLicense.type - end - end + local player = NDCore.getPlayer(inv.id) + if not player then return end + + local licenses = player.getMetadata("licenses") or {} + for i=1, #licenses do + local characterLicense = licenses[i] + if characterLicense.type == license and characterLicense.status == "valid" then + return characterLicense.type + end + end end ---@diagnostic disable-next-line: duplicate-set-field @@ -124,6 +93,24 @@ function server.buyLicense(inv, license) end Inventory.RemoveItem(inv, "money", license.price) - NDCore.Functions.CreatePlayerLicense(inv.owner, "weapon") + local player = NDCore.getPlayer(inv.id) + player.createLicense("weapon") return true, "have_purchased" end + +---@diagnostic disable-next-line: duplicate-set-field +function server.isPlayerBoss(playerId, group) + local player = NDCore.getPlayer(playerId) + if not player then return end + + local groupInfo = player.getGroup(group) + return groupInfo and groupInfo.isBoss +end + +---@param entityId number +---@return number | string +---@diagnostic disable-next-line: duplicate-set-field +function server.getOwnedVehicleId(entityId) + return NDCore.getVehicle(entityId)?.id +end + diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/client.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/client.lua index 3eee6f856..8e760bd08 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/client.lua @@ -1,10 +1,10 @@ -local onLogout = ... +CreateThread(function() lib.load('@ox_core.imports.client') end) -RegisterNetEvent("ox:playerLogout", onLogout) +RegisterNetEvent('ox:playerLogout', client.onLogout) -RegisterNetEvent("ox:setGroup", function(name, grade) +RegisterNetEvent('ox:setGroup', function(name, grade) PlayerData.groups[name] = grade - OnPlayerData("groups") + OnPlayerData('groups') end) ---@diagnostic disable-next-line: duplicate-set-field @@ -14,7 +14,7 @@ function client.setPlayerStatus(values) -- we need to awkwardly change the value if value > 100 or value < -100 then -- Hunger and thirst start at 0 and go up to 100 as you get hungry/thirsty (inverse of ESX) - if name == "hunger" or name == "thirst" then + if (name == 'hunger' or name == 'thirst') then value = -value end diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/server.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/server.lua index 93e402470..ec2bd664d 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/ox/server.lua @@ -1,13 +1,12 @@ -local playerDropped = ... -local Inventory = require("modules.inventory.server") +CreateThread(function() lib.load('@ox_core.imports.server') end) -AddEventHandler("ox:playerLogout", playerDropped) +local Inventory = require 'modules.inventory.server' -AddEventHandler("ox:setGroup", function(source, name, grade) +AddEventHandler('ox:playerLogout', server.playerDropped) + +AddEventHandler('ox:setGroup', function(source, name, grade) local inventory = Inventory(source) - if not inventory then - return - end + if not inventory then return end inventory.player.groups[name] = grade end) @@ -22,20 +21,26 @@ function server.buyLicense(inv, license) local player = Ox.GetPlayer(inv.id) if player.getLicense(license.name) then - return false, "already_have" - elseif Inventory.GetItem(inv, "money", false, true) < license.price then - return false, "can_not_afford" + return false, 'already_have' + elseif Inventory.GetItem(inv, 'money', false, true) < license.price then + return false, 'can_not_afford' end - Inventory.RemoveItem(inv, "money", license.price) + Inventory.RemoveItem(inv, 'money', license.price) player.addLicense(license.name) - return true, "have_purchased" + return true, 'have_purchased' end ---@diagnostic disable-next-line: duplicate-set-field function server.isPlayerBoss(playerId, group, grade) - local groupData = GlobalState[("group.%s"):format(group)] + local groupData = GlobalState[('group.%s'):format(group)] return groupData and grade >= groupData.adminGrade end + +---@param entityId number +---@return number | string +function server.getOwnedVehicleId(entityId) + return Ox.GetVehicle(entityId)?.id +end diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/client.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/client.lua index 6b7a11ddb..1571543bc 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/client.lua @@ -1,43 +1,34 @@ -local onLogout, Weapon = ... -local QBCore = exports["qb-core"]:GetCoreObject() -local Inventory = require("modules.inventory.client") +local QBCore = exports['qb-core']:GetCoreObject() +local Inventory = require 'modules.inventory.client' +local Weapon = require 'modules.weapon.client' -RegisterNetEvent("QBCore:Client:OnPlayerUnload", onLogout) +RegisterNetEvent('QBCore:Client:OnPlayerUnload', client.onLogout) -RegisterNetEvent("QBCore:Player:SetPlayerData", function(data) - if source == "" or not PlayerData.loaded then - return - end +RegisterNetEvent('QBCore:Player:SetPlayerData', function(data) + if source == '' or not PlayerData.loaded then return end if (data.metadata.isdead or data.metadata.inlaststand) ~= PlayerData.dead then PlayerData.dead = data.metadata.isdead or data.metadata.inlaststand - OnPlayerData("dead", PlayerData.dead) + OnPlayerData('dead', PlayerData.dead) end local groups = PlayerData.groups - if - not groups[data.job.name] - or not groups[data.gang.name] - or groups[data.job.name] ~= data.job.grade.level - or groups[data.gang.name] ~= data.gang.grade.level - then + if not groups[data.job.name] or not groups[data.gang.name] or groups[data.job.name] ~= data.job.grade.level or groups[data.gang.name] ~= data.gang.grade.level then PlayerData.groups = { [data.job.name] = data.job.grade.level, [data.gang.name] = data.gang.grade.level, } - OnPlayerData("groups", PlayerData.groups) + OnPlayerData('groups', PlayerData.groups) end end) -RegisterNetEvent("police:client:GetCuffed", function() +RegisterNetEvent('police:client:GetCuffed', function() PlayerData.cuffed = not PlayerData.cuffed - LocalPlayer.state:set("invBusy", PlayerData.cuffed, false) + LocalPlayer.state:set('invBusy', PlayerData.cuffed, false) - if not PlayerData.cuffed then - return - end + if not PlayerData.cuffed then return end Weapon.Disarm() end) @@ -45,21 +36,22 @@ end) ---@diagnostic disable-next-line: duplicate-set-field function client.setPlayerStatus(values) for name, value in pairs(values) do + -- compatibility for ESX style values if value > 100 or value < -100 then value = value * 0.0001 end if name == "hunger" then - TriggerServerEvent("consumables:server:addHunger", QBCore.Functions.GetPlayerData().metadata.hunger + value) + TriggerServerEvent('consumables:server:addHunger', QBCore.Functions.GetPlayerData().metadata.hunger + value) elseif name == "thirst" then - TriggerServerEvent("consumables:server:addThirst", QBCore.Functions.GetPlayerData().metadata.thirst + value) + TriggerServerEvent('consumables:server:addThirst', QBCore.Functions.GetPlayerData().metadata.thirst + value) elseif name == "stress" then if value > 0 then - TriggerServerEvent("hud:server:GainStress", value) + TriggerServerEvent('hud:server:GainStress', value) else value = math.abs(value) - TriggerServerEvent("hud:server:RelieveStress", value) + TriggerServerEvent('hud:server:RelieveStress', value) end end end @@ -67,23 +59,27 @@ end -- taken from qbox-core (https://github.com/Qbox-project/qb-core/blob/f4174f311aae8157181a48fa2e2bd30c8d13edb1/client/functions.lua#L25) local function hasItem(items, amount) - amount = amount or 1 + amount = amount or 1 - local count = Inventory.Search("count", items) + local count = Inventory.Search('count', items) - if type(items) == "table" and type(count) == "table" then - for _, v in pairs(count) do - if v < amount then - return false - end - end + if type(items) == 'table' and type(count) == 'table' then + for _, v in pairs(count) do + if v < amount then + return false + end + end - return true - end + return true + end - return count >= amount + return count >= amount end -AddEventHandler("__cfx_export_qb-inventory_HasItem", function(setCB) +AddStateBagChangeHandler('inv_busy', ('player:%s'):format(cache.serverId), function(_, _, value) + LocalPlayer.state:set('invBusy', value, false) +end) + +AddEventHandler(('__cfx_export_qb-inventory_HasItem'), function(setCB) setCB(hasItem) end) diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/server.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/server.lua index 69b2ff93f..fb7f6a2ee 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/qb/server.lua @@ -1,14 +1,9 @@ -local playerDropped = ... -local Inventory, Items - -CreateThread(function() - Inventory = require 'modules.inventory.server' - Items = require 'modules.items.server' -end) +local Inventory = require 'modules.inventory.server' +local Items = require 'modules.items.server' local QBCore -AddEventHandler('QBCore:Server:OnPlayerUnload', playerDropped) +AddEventHandler('QBCore:Server:OnPlayerUnload', server.playerDropped) AddEventHandler('QBCore:Server:OnJobUpdate', function(source, job) local inventory = Inventory(source) @@ -43,14 +38,6 @@ local function setItemCompatibilityProps(item) end local function setupPlayer(Player) - QBCore.Functions.AddPlayerField(Player.PlayerData.source, 'syncInventory', function(_, _, items, money) - Player.Functions.SetPlayerData('items', items) - - if money.money then - Player.Functions.SetMoney('cash', money.money, "Sync money with inventory") - end - end) - Player.PlayerData.inventory = Player.PlayerData.items Player.PlayerData.identifier = Player.PlayerData.citizenid @@ -108,11 +95,6 @@ SetTimeout(500, function() for _, Player in pairs(QBCore.Functions.GetQBPlayers()) do setupPlayer(Player) end end) --- Accounts that need to be synced with physical items -server.accounts = { - money = 0 -} - function server.UseItem(source, itemName, data) local cb = QBCore.Functions.CanUseItem(itemName) return cb and cb(source, data) @@ -120,7 +102,11 @@ end AddEventHandler('QBCore:Server:OnMoneyChange', function(src, account, amount, changeType) if account ~= "cash" then return end + local item = Inventory.GetItem(src, 'money', nil, false) + + if not item then return end + Inventory.SetItem(src, 'money', changeType == "set" and amount or changeType == "remove" and item.count - amount or changeType == "add" and item.count + amount) end) @@ -144,16 +130,16 @@ end ---@diagnostic disable-next-line: duplicate-set-field function server.syncInventory(inv) - local money = table.clone(server.accounts) + local accounts = Inventory.GetAccountItemCounts(inv) - for _, v in pairs(inv.items) do - if money[v.name] then - money[v.name] += v.count + if accounts then + local player = server.GetPlayerFromId(inv.id) + player.Functions.SetPlayerData('items', inv.items) + + if accounts.money and accounts.money ~= player.Functions.GetMoney('cash') then + player.Functions.SetMoney('cash', accounts.money, "Sync money with inventory") end end - - local player = server.GetPlayerFromId(inv.id) - player.syncInventory(inv.weight, inv.maxWeight, inv.items, money) end ---@diagnostic disable-next-line: duplicate-set-field @@ -167,14 +153,14 @@ function server.buyLicense(inv, license) local player = server.GetPlayerFromId(inv.id) if not player then return end - if player.PlayerData.metadata.licences[license] then + if player.PlayerData.metadata.licences[license.name] then return false, 'already_have' elseif Inventory.GetItem(inv, 'money', false, true) < license.price then return false, 'can_not_afford' end Inventory.RemoveItem(inv, 'money', license.price) - player.PlayerData.metadata.licences.weapon = true + player.PlayerData.metadata.licences[license.name] = true player.Functions.SetMetaData('licences', player.PlayerData.metadata.licences) return true, 'have_purchased' diff --git a/server-data/resources/[ox]/ox_inventory/modules/bridge/server.lua b/server-data/resources/[ox]/ox_inventory/modules/bridge/server.lua index fa14d1428..2c68e84ee 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/bridge/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/bridge/server.lua @@ -37,45 +37,23 @@ function server.buyLicense() warn('Licenses are not supported for the current framework.') end -local Inventory +local Inventory = require 'modules.inventory.server' -CreateThread(function() - Inventory = require 'modules.inventory.server' -end) - -local function playerDropped(source) +function server.playerDropped(source) local inv = Inventory(source) --[[@as OxInventory]] if inv?.player then inv:closeInventory() - - if shared.framework ~= 'esx' then - db.savePlayer(inv.owner, json.encode(inv:minimal())) - end - - Inventory.Remove(inv, true) + Inventory.Remove(inv) end end -AddEventHandler('playerDropped', function() - playerDropped(source) -end) - -local scriptPath = ('modules/bridge/%s/server.lua'):format(shared.framework) -local resourceFile = LoadResourceFile(cache.resource, scriptPath) +local success, result = pcall(lib.load, ('modules.bridge.%s.server'):format(shared.framework)) -if not resourceFile then - lib = nil - return error(("Unable to find framework bridge for '%s'"):format(shared.framework)) +if not success then + lib.print.error(result) + lib = nil + return end -local func, err = load(resourceFile, ('@@%s/%s'):format(cache.resource, scriptPath)) - -if not func or err then - lib = nil - return error(err) -end - -func(playerDropped) - if server.convertInventory then exports('ConvertItems', server.convertInventory) end diff --git a/server-data/resources/[ox]/ox_inventory/modules/crafting/client.lua b/server-data/resources/[ox]/ox_inventory/modules/crafting/client.lua new file mode 100644 index 000000000..5c3b4246c --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/modules/crafting/client.lua @@ -0,0 +1,101 @@ +if not lib then return end + +local CraftingBenches = {} +local Items = require 'modules.items.client' +local createBlip = require 'modules.utils.client'.CreateBlip + +---@param id number +---@param data table +local function createCraftingBench(id, data) + CraftingBenches[id] = {} + local recipes = data.items + + if recipes then + data.slots = #recipes + + for i = 1, data.slots do + local recipe = recipes[i] + local item = Items[recipe.name] + + if item then + recipe.weight = item.weight + recipe.slot = i + else + warn(('failed to setup crafting recipe (bench: %s, slot: %s) - item "%s" does not exist'):format(id, i, recipe.name)) + end + end + + local blip = data.blip + + if blip then + blip.name = blip.name or ('ox_crafting_%s'):format(data.label and id or 0) + AddTextEntry(blip.name, data.label or locale('crafting_bench')) + end + + if shared.target then + data.points = nil + if data.zones then + for i = 1, #data.zones do + local zone = data.zones[i] + zone.name = ("craftingbench_%s:%s"):format(id, i) + zone.id = id + zone.index = i + zone.options = { + { + label = zone.label or locale('open_crafting_bench'), + canInteract = data.groups and function() + return client.hasGroup(data.groups) + end or nil, + onSelect = function() + client.openInventory('crafting', { id = id, index = i }) + end, + distance = zone.distance or 2.0, + icon = zone.icon or 'fas fa-wrench', + } + } + + exports.ox_target:addBoxZone(zone) + + if blip then + createBlip(blip, zone.coords) + end + end + end + elseif data.points then + data.zones = nil + + ---@param point CPoint + local function nearbyBench(point) + ---@diagnostic disable-next-line: param-type-mismatch + DrawMarker(2, point.coords.x, point.coords.y, point.coords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.15, 150, 150, 30, 222, false, false, 0, true, false, false, false) + + if point.isClosest and point.currentDistance < 1.2 and IsControlJustReleased(0, 38) then + client.openInventory('crafting', { id = point.benchid, index = point.index }) + end + end + + for i = 1, #data.points do + local coords = data.points[i] + + lib.points.new({ + coords = coords, + distance = 16, + benchid = id, + index = i, + inv = 'crafting', + nearby = nearbyBench + }) + + if blip then + createBlip(blip, coords) + end + end + end + + CraftingBenches[id] = data + end +end + +for id, data in pairs(lib.load('data.crafting')) do createCraftingBench(id, data) end + +return CraftingBenches diff --git a/server-data/resources/[ox]/ox_inventory/modules/crafting/server.lua b/server-data/resources/[ox]/ox_inventory/modules/crafting/server.lua new file mode 100644 index 000000000..aca650dd8 --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/modules/crafting/server.lua @@ -0,0 +1,230 @@ +if not lib then return end + +local CraftingBenches = {} +local Items = require 'modules.items.server' +local Inventory = require 'modules.inventory.server' + +---@param id number +---@param data table +local function createCraftingBench(id, data) + CraftingBenches[id] = {} + local recipes = data.items + + if recipes then + for i = 1, #recipes do + local recipe = recipes[i] + local item = Items(recipe.name) + + if item then + recipe.weight = item.weight + recipe.slot = i + else + warn(('failed to setup crafting recipe (bench: %s, slot: %s) - item "%s" does not exist'):format(id, i, recipe.name)) + end + + for ingredient, needs in pairs(recipe.ingredients) do + if needs < 1 then + item = Items(ingredient) + + if item and not item.durability then + item.durability = true + end + end + end + end + + if shared.target then + data.points = nil + else + data.zones = nil + end + + CraftingBenches[id] = data + end +end + +for id, data in pairs(lib.load('data.crafting')) do createCraftingBench(id, data) end + +---falls back to player coords if zones and points are both nil +---@param source number +---@param bench table +---@param index number +---@return vector3 +local function getCraftingCoords(source, bench, index) + if not bench.zones and not bench.points then + return GetEntityCoords(GetPlayerPed(source)) + else + return shared.target and bench.zones[index].coords or bench.points[index] + end +end + +lib.callback.register('ox_inventory:openCraftingBench', function(source, id, index) + local left, bench = Inventory(source), CraftingBenches[id] + + if not left then return end + + if bench then + local groups = bench.groups + local coords = getCraftingCoords(source, bench, index) + + if not coords then return end + + if groups and not server.hasGroup(left, groups) then return end + if #(GetEntityCoords(GetPlayerPed(source)) - coords) > 10 then return end + + if left.open and left.open ~= source then + local inv = Inventory(left.open) --[[@as OxInventory]] + + -- Why would the player inventory open with an invalid target? Can't repro but whatever. + if inv?.player then + inv:closeInventory() + end + end + + left:openInventory(left) + end + + return { label = left.label, type = left.type, slots = left.slots, weight = left.weight, maxWeight = left.maxWeight } +end) + +local TriggerEventHooks = require 'modules.hooks.server' + +lib.callback.register('ox_inventory:craftItem', function(source, id, index, recipeId, toSlot) + local left, bench = Inventory(source), CraftingBenches[id] + + if not left then return end + + if bench then + local groups = bench.groups + local coords = getCraftingCoords(source, bench, index) + + if groups and not server.hasGroup(left, groups) then return end + if #(GetEntityCoords(GetPlayerPed(source)) - coords) > 10 then return end + + local recipe = bench.items[recipeId] + + if recipe then + local tbl, num = {}, 0 + + for name in pairs(recipe.ingredients) do + num += 1 + tbl[num] = name + end + + local craftedItem = Items(recipe.name) + local craftCount = (type(recipe.count) == 'number' and recipe.count) or (table.type(recipe.count) == 'array' and math.random(recipe.count[1], recipe.count[2])) or 1 + local newWeight = left.weight + (craftedItem.weight + (recipe.metadata?.weight or 0)) * craftCount + ---@todo new iterator or something to accept a map + local items = Inventory.Search(left, 'slots', tbl) or {} + table.wipe(tbl) + + for name, needs in pairs(recipe.ingredients) do + local slots = items[name] or items + + for i = 1, #slots do + local slot = slots[i] + + if needs == 0 then + if not slot.metadata.durability or slot.metadata.durability > 0 then + break + end + elseif needs < 1 then + local item = Items(name) + local durability = slot.metadata.durability + + if durability and durability >= needs * 100 then + if durability > 100 then + local degrade = (slot.metadata.degrade or item.degrade) * 60 + local percentage = ((durability - os.time()) * 100) / degrade + + if percentage >= needs * 100 then + tbl[slot.slot] = needs + break + end + else + tbl[slot.slot] = needs + break + end + end + elseif needs <= slot.count then + local itemWeight = slot.weight / slot.count + newWeight = (newWeight - slot.weight) + (slot.count - needs) * itemWeight + tbl[slot.slot] = needs + break + else + tbl[slot.slot] = slot.count + newWeight -= slot.weight + needs -= slot.count + end + + if needs == 0 then break end + -- Player does not have enough items (ui should prevent crafting if lacking items, so this shouldn't trigger) + if needs > 0 and i == #slots then return end + end + end + + if newWeight > left.maxWeight then + return false, 'cannot_carry' + end + + if not TriggerEventHooks('craftItem', { + source = source, + benchId = id, + benchIndex = index, + recipe = recipe, + toInventory = left.id, + toSlot = toSlot, + }) then return false end + + local success = lib.callback.await('ox_inventory:startCrafting', source, id, recipeId) + + if success then + for name, needs in pairs(recipe.ingredients) do + if Inventory.GetItem(left, name, nil, true) < needs then return end + end + + for slot, count in pairs(tbl) do + local invSlot = left.items[slot] + + if not invSlot then return end + + if count < 1 then + local item = Items(invSlot.name) + local durability = invSlot.metadata.durability or 100 + + if durability > 100 then + local degrade = (invSlot.metadata.degrade or item.degrade) * 60 + durability -= degrade * count + else + durability -= count * 100 + end + + if invSlot.count > 1 then + local emptySlot = Inventory.GetEmptySlot(left) + + if emptySlot then + local newItem = Inventory.SetSlot(left, item, 1, table.deepclone(invSlot.metadata), emptySlot) + + if newItem then + Items.UpdateDurability(left, newItem, item, durability < 0 and 0 or durability) + end + end + + invSlot.count -= 1 + else + Items.UpdateDurability(left, invSlot, item, durability < 0 and 0 or durability) + end + else + local removed = invSlot and Inventory.RemoveItem(left, invSlot.name, count, nil, slot) + -- Failed to remove item (inventory state unexpectedly changed?) + if not removed then return end + end + end + + Inventory.AddItem(left, craftedItem, craftCount, recipe.metadata or {}, craftedItem.stack and toSlot or nil) + end + + return success + end + end +end) diff --git a/server-data/resources/[ox]/ox_inventory/modules/hooks/server.lua b/server-data/resources/[ox]/ox_inventory/modules/hooks/server.lua index 50296622a..011d2e578 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/hooks/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/hooks/server.lua @@ -1,15 +1,13 @@ -if not lib then - return -end +if not lib then return end local eventHooks = {} local microtime = os.microtime local function itemFilter(filter, item, secondItem) - local itemName = type(item) == "table" and item.name or item + local itemName = type(item) == 'table' and item.name or item if not itemName or not filter[itemName] then - if type(secondItem) ~= "table" or not filter[secondItem.name] then + if type(secondItem) ~= 'table' or not filter[secondItem.name] then return false end end @@ -34,25 +32,16 @@ local function typeFilter(filter, type) end local function TriggerEventHooks(event, payload) - local hooks = eventHooks[event] + local hooks = eventHooks[event] - if hooks then - local fromInventory = payload.fromInventory and tostring(payload.fromInventory) - or payload.inventoryId and tostring(payload.inventoryId) - or payload.shopType and tostring(payload.shopType) + if hooks then + local fromInventory = payload.fromInventory and tostring(payload.fromInventory) or payload.inventoryId and tostring(payload.inventoryId) or payload.shopType and tostring(payload.shopType) local toInventory = payload.toInventory and tostring(payload.toInventory) - for i = 1, #hooks do + for i = 1, #hooks do local hook = hooks[i] - if - hook.itemFilter - and not itemFilter( - hook.itemFilter, - payload.fromSlot or payload.item or payload.itemName or payload.recipe, - payload.toSlot - ) - then + if hook.itemFilter and not itemFilter(hook.itemFilter, payload.fromSlot or payload.item or payload.itemName or payload.recipe, payload.toSlot) then goto skipLoop end @@ -60,7 +49,7 @@ local function TriggerEventHooks(event, payload) goto skipLoop end - if hook.typeFilter and not typeFilter(hook.typeFilter, payload.inventoryType or payload.shopType) then + if hook.typeFilter and not typeFilter(hook.typeFilter, payload.inventoryType or payload.shopType or payload.fromType) then goto skipLoop end @@ -69,50 +58,43 @@ local function TriggerEventHooks(event, payload) end local start = microtime() - local _, response = pcall(hooks[i], payload) + local _, response = pcall(hooks[i], payload) local executionTime = microtime() - start if executionTime >= 100000 then - warn( - ('Execution of event hook "%s:%s:%s" took %.2fms.'):format( - hook.resource, - event, - i, - executionTime / 1e3 - ) - ) + warn(('Execution of event hook "%s:%s:%s" took %.2fms.'):format(hook.resource, event, i, executionTime / 1e3)) end - if event == "createItem" then - if type(response) == "table" then + if event == 'createItem' then + if type(response) == 'table' then payload.metadata = response end elseif response == false then - return false - end + return false + end ::skipLoop:: - end - end + end + end - if event == "createItem" then + if event == 'createItem' then return payload.metadata end - return true + return true end local hookId = 0 -exports("registerHook", function(event, cb, options) - if not eventHooks[event] then - eventHooks[event] = {} - end +exports('registerHook', function(event, cb, options) + if not eventHooks[event] then + eventHooks[event] = {} + end local mt = getmetatable(cb) mt.__index = nil mt.__newindex = nil - cb.resource = GetInvokingResource() + cb.resource = GetInvokingResource() hookId += 1 cb.hookId = hookId @@ -122,25 +104,25 @@ exports("registerHook", function(event, cb, options) end end - eventHooks[event][#eventHooks[event] + 1] = cb + eventHooks[event][#eventHooks[event] + 1] = cb return hookId end) local function removeResourceHooks(resource, id) - for _, hooks in pairs(eventHooks) do - for i = #hooks, 1, -1 do + for _, hooks in pairs(eventHooks) do + for i = #hooks, 1, -1 do local hook = hooks[i] - if hook.resource == resource and (not id or hook.id == id) then - table.remove(hooks, i) - end - end - end + if hook.resource == resource and (not id or hook.hookId == id) then + table.remove(hooks, i) + end + end + end end -AddEventHandler("onResourceStop", removeResourceHooks) +AddEventHandler('onResourceStop', removeResourceHooks) -exports("removeHooks", function(id) +exports('removeHooks', function(id) removeResourceHooks(GetInvokingResource() or cache.resource, id) end) diff --git a/server-data/resources/[ox]/ox_inventory/modules/interface/client.lua b/server-data/resources/[ox]/ox_inventory/modules/interface/client.lua index 6861c77f0..8a7dbdb95 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/interface/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/interface/client.lua @@ -1,13 +1,11 @@ -if not lib then - return -end +if not lib then return end -- Module is deprecated and provided for compatibility -- All functions are now part of with ox_lib -exports("Keyboard", lib.inputDialog) +exports('Keyboard', lib.inputDialog) -exports("Progress", function(options, completed) +exports('Progress', function(options, completed) local success = lib.progressBar(options) if completed then @@ -15,5 +13,5 @@ exports("Progress", function(options, completed) end end) -exports("CancelProgress", lib.cancelProgress) -exports("ProgressActive", lib.progressActive) +exports('CancelProgress', lib.cancelProgress) +exports('ProgressActive', lib.progressActive) diff --git a/server-data/resources/[ox]/ox_inventory/modules/inventory/client.lua b/server-data/resources/[ox]/ox_inventory/modules/inventory/client.lua index 3f36161d5..cff71f701 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/inventory/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/inventory/client.lua @@ -18,19 +18,89 @@ function Inventory.OpenDumpster(entity) end end +local Utils = require 'modules.utils.client' +local Vehicles = lib.load('data.vehicles') +local backDoorIds = { 2, 3 } + +function Inventory.CanAccessTrunk(entity) + if cache.vehicle or not NetworkGetEntityIsNetworked(entity) then return end + + local vehicleHash = GetEntityModel(entity) + local vehicleClass = GetVehicleClass(entity) + local checkVehicle = Vehicles.Storage[vehicleHash] + + if (checkVehicle == 0 or checkVehicle == 1) or (not Vehicles.trunk[vehicleClass] and not Vehicles.trunk.models[vehicleHash]) then return end + + ---@type number | number[] + local doorId = checkVehicle and 4 or 5 + + if not Vehicles.trunk.boneIndex?[vehicleHash] and not GetIsDoorValid(entity, doorId --[[@as number]]) then + if vehicleClass ~= 11 and (doorId ~= 5 or GetEntityBoneIndexByName(entity, 'boot') ~= -1 or not GetIsDoorValid(entity, 2)) then + return + end + + if vehicleClass ~= 11 then + doorId = backDoorIds + end + end + + local min, max = GetModelDimensions(vehicleHash) + local offset = (max - min) * (not checkVehicle and vec3(0.5, 0, 0.5) or vec3(0.5, 1, 0.5)) + min + offset = GetOffsetFromEntityInWorldCoords(entity, offset.x, offset.y, offset.z) + + if #(GetEntityCoords(cache.ped) - offset) < 1.5 then + local coords = GetEntityCoords(entity) + + TaskTurnPedToFaceCoord(cache.ped, coords.x, coords.y, coords.z, 0) + + return doorId + end +end + +function Inventory.OpenTrunk(entity) + ---@type number | number[] | nil + local door = Inventory.CanAccessTrunk(entity) + + if not door then return end + + if GetVehicleDoorLockStatus(entity) > 1 then + return lib.notify({ id = 'vehicle_locked', type = 'error', description = locale('vehicle_locked') }) + end + + local plate = GetVehicleNumberPlateText(entity) + local invId = 'trunk'..plate + local coords = GetEntityCoords(entity) + + TaskTurnPedToFaceCoord(cache.ped, coords.x, coords.y, coords.z, 0) + + if not client.openInventory('trunk', { id = invId, netid = NetworkGetNetworkIdFromEntity(entity), entityid = entity, door = door }) then return end + + if type(door) == 'table' then + for i = 1, #door do + SetVehicleDoorOpen(entity, door[i], false, false) + end + else + SetVehicleDoorOpen(entity, door --[[@as number]], false, false) + end +end + if shared.target then - exports.qtarget:AddTargetModel(Inventory.Dumpsters, { - options = { - { - icon = 'fas fa-dumpster', - label = locale('search_dumpster'), - action = function(entity) - Inventory.OpenDumpster(entity) - end - }, - }, - distance = 2 + exports.ox_target:addModel(Inventory.Dumpsters, { + icon = 'fas fa-dumpster', + label = locale('search_dumpster'), + onSelect = function(data) return Inventory.OpenDumpster(data.entity) end, + distance = 2 }) + + exports.ox_target:addGlobalVehicle({ + icon = 'fas fa-truck-ramp-box', + label = locale('open_label', locale('storage')), + distance = 1.5, + canInteract = Inventory.CanAccessTrunk, + onSelect = function(data) + return Inventory.OpenTrunk(data.entity) + end + }) else local dumpsters = table.create(0, #Inventory.Dumpsters) @@ -41,8 +111,6 @@ else Inventory.Dumpsters = dumpsters end -local table = lib.table - ---@param search 'slots' | 1 | 'count' | 2 ---@param item table | string ---@param metadata? table | string @@ -94,7 +162,7 @@ exports('GetPlayerWeight', function() end) exports('GetPlayerMaxWeight', function() - return PlayerData.weight + return PlayerData.maxWeight end) local Items = require 'modules.items.client' @@ -229,37 +297,28 @@ local function nearbyEvidence(point) end end -Inventory.Evidence = setmetatable(data('evidence'), { +Inventory.Evidence = setmetatable(lib.load('data.evidence'), { __call = function(self) for _, evidence in pairs(self) do if evidence.point then evidence.point:remove() - end + elseif evidence.zoneId then + exports.ox_target:removeZone(evidence.zoneId) + evidence.zone = nil + end if client.hasGroup(shared.police) then if shared.target then if evidence.target then - exports.qtarget:RemoveZone(evidence.target.name) - exports.qtarget:AddBoxZone(evidence.target.name, evidence.target.loc, evidence.target.length or 0.5, evidence.target.width or 0.5, - { - name = evidence.target.name, - heading = evidence.target.heading or 0.0, - debugPoly = evidence.target.debug, - minZ = evidence.target.minZ, - maxZ = evidence.target.maxZ, - drawSprite = evidence.target.drawSprite, - }, { - options = { - { - icon = evidence.target.icon or 'fas fa-warehouse', - label = locale('open_police_evidence'), - job = shared.police, - action = openEvidence, - iconColor = evidence.target.iconColor, - }, - }, - distance = evidence.target.distance or 2.0 - }) + evidence.zoneId = Utils.CreateBoxZone(evidence.target, { + { + icon = evidence.target.icon or 'fas fa-warehouse', + label = locale('open_police_evidence'), + groups = shared.police, + onSelect = openEvidence, + iconColor = evidence.target.iconColor, + } + }) end else evidence.target = nil @@ -280,41 +339,32 @@ local function nearbyStash(self) DrawMarker(2, self.coords.x, self.coords.y, self.coords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.15, 30, 30, 150, 222, false, false, 0, true, false, false, false) end -Inventory.Stashes = setmetatable(data('stashes'), { +Inventory.Stashes = setmetatable(lib.load('data.stashes'), { __call = function(self) for id, stash in pairs(self) do if stash.jobs then stash.groups = stash.jobs end if stash.point then stash.point:remove() - end + elseif stash.zoneId then + exports.ox_target:removeZone(stash.zoneId) + stash.zoneId = nil + end if not stash.groups or client.hasGroup(stash.groups) then if shared.target then if stash.target then - exports.qtarget:RemoveZone(stash.name) - exports.qtarget:AddBoxZone(stash.name, stash.target.loc, stash.target.length or 0.5, stash.target.width or 0.5, - { - name = stash.name, - heading = stash.target.heading or 0.0, - debugPoly = stash.target.debug, - minZ = stash.target.minZ, - maxZ = stash.target.maxZ, - drawSprite = stash.target.drawSprite, - }, { - options = { - { - icon = stash.target.icon or 'fas fa-warehouse', - label = stash.target.label or locale('open_stash'), - job = stash.groups, - action = function() - exports.ox_inventory:openInventory('stash', stash.name) - end, - iconColor = stash.target.iconColor, - }, - }, - distance = stash.target.distance or 3.0 - }) + stash.zoneId = Utils.CreateBoxZone(stash.target, { + { + icon = stash.target.icon or 'fas fa-warehouse', + label = stash.target.label or locale('open_stash'), + groups = stash.groups, + onSelect = function() + exports.ox_inventory:openInventory('stash', stash.name) + end, + iconColor = stash.target.iconColor, + }, + }) end else stash.target = nil @@ -331,7 +381,11 @@ Inventory.Stashes = setmetatable(data('stashes'), { end }) -RegisterNetEvent('refreshMaxWeight', function(data) +RegisterNetEvent('ox_inventory:refreshMaxWeight', function(data) + if data.inventoryId == cache.serverId then + PlayerData.maxWeight = data.maxWeight + end + SendNUIMessage({ action = 'refreshSlots', data = { @@ -343,4 +397,16 @@ RegisterNetEvent('refreshMaxWeight', function(data) }) end) +RegisterNetEvent('ox_inventory:refreshSlotCount', function(data) + SendNUIMessage({ + action = 'refreshSlots', + data = { + slotsData = { + inventoryId = data.inventoryId, + slots = data.slots + } + } + }) +end) + return Inventory diff --git a/server-data/resources/[ox]/ox_inventory/modules/inventory/server.lua b/server-data/resources/[ox]/ox_inventory/modules/inventory/server.lua index 5c7756b85..79a14b037 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/inventory/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/inventory/server.lua @@ -2,43 +2,17 @@ if not lib then return end local Inventory = {} ----@class OxInventoryProperties ----@field id any trust me it's less annoying this way ----@field dbId string|number ----@field label string ----@field type string ----@field slots number ----@field weight number ----@field maxWeight number ----@field open? number|false ----@field items table ----@field set function ----@field get function ----@field minimal function ----@field time number ----@field owner? string|number|boolean ----@field groups? table ----@field coords? vector3 ----@field datastore? boolean ----@field changed? boolean ----@field weapon? number ----@field containerSlot? number ----@field player? { source: number, ped: number, groups: table, name?: string, sex?: string, dateofbirth?: string } ----@field netid? number ----@field distance? number ----@field openedBy { [number]: true } ----@field currentShop? string - ----@alias inventory OxInventory | table | string | number - ----@class OxInventory : OxInventoryProperties +---@type table +local Inventories = {} + +---@class OxInventory local OxInventory = {} OxInventory.__index = OxInventory ---Open a player's inventory, optionally with a secondary inventory. ---@param inv? inventory function OxInventory:openInventory(inv) - if not self.player then return end + if not self?.player then return end inv = Inventory(inv) @@ -54,14 +28,14 @@ end ---Close a player's inventory. ---@param noEvent? boolean function OxInventory:closeInventory(noEvent) - if not self.player then return end + if not self.player or not self.open then return end - local inv = self.open and Inventory(self.open) + local inv = Inventory(self.open) if not inv then return end - inv:set('open', false) inv.openedBy[self.id] = nil + inv:set('open', false) self.open = false self.currentShop = nil self.containerSlot = nil @@ -84,26 +58,27 @@ end ---Sync an inventory's state with all player's accessing it. ---@param slots updateSlot[] ----@param weight { left?: number, right?: number } ---@param syncOwner? boolean -function OxInventory:syncSlotsWithClients(slots, weight, syncOwner) +function OxInventory:syncSlotsWithClients(slots, syncOwner) for playerId in pairs(self.openedBy) do if self.id ~= playerId then - TriggerClientEvent('ox_inventory:updateSlots', playerId, slots, weight) + local target = Inventories[playerId] + + if target then + TriggerClientEvent('ox_inventory:updateSlots', playerId, slots, target.weight) + end end end if syncOwner and self.player then - TriggerClientEvent('ox_inventory:updateSlots', self.id, slots, weight) + TriggerClientEvent('ox_inventory:updateSlots', self.id, slots, self.weight) end end ----@type table -local Inventories = {} -local Vehicles = data 'vehicles' +local Vehicles = lib.load('data.vehicles') local RegisteredStashes = {} -for _, stash in pairs(data 'stashes') do +for _, stash in pairs(lib.load('data.stashes')) do RegisteredStashes[stash.name] = { name = stash.name, label = stash.label, @@ -111,7 +86,7 @@ for _, stash in pairs(data 'stashes') do slots = stash.slots, maxWeight = stash.weight, groups = stash.groups or stash.jobs, - coords = shared.target and stash.target.loc or stash.coords + coords = shared.target and stash.target?.loc or stash.coords } end @@ -154,6 +129,8 @@ local function loadInventoryData(data, player) if not entity then return shared.info('Failed to load vehicle inventory data (no entity exists with given netid).') end + + data.entityId = entity else local vehicles = GetAllVehicles() @@ -163,6 +140,7 @@ local function loadInventoryData(data, player) if _plate:find(plate) then entity = vehicle + data.entityId = entity data.netid = NetworkGetNetworkIdFromEntity(entity) break end @@ -183,18 +161,15 @@ local function loadInventoryData(data, player) local model, class = lib.callback.await('ox_inventory:getVehicleData', source, data.netid) local storage = Vehicles[data.type].models[model] or Vehicles[data.type][class] + local dbId - if Ox then - local vehicle = Ox.GetVehicle(entity) + if server.getOwnedVehicleId then + dbId = server.getOwnedVehicleId(entity) + else + dbId = data.id:sub(6) + end - if vehicle then - inventory = Inventory.Create(vehicle.id or vehicle.plate, plate, data.type, storage[1], 0, storage[2], false) - end - end - - if not inventory then - inventory = Inventory.Create(data.id, plate, data.type, storage[1], 0, storage[2], false) - end + inventory = Inventory.Create(data.id, plate, data.type, storage[1], 0, storage[2], false, nil, nil, dbId) end elseif data.type == 'policeevidence' then inventory = Inventory.Create(data.id, locale('police_evidence'), data.type, 100, 0, 100000, false) @@ -209,7 +184,7 @@ local function loadInventoryData(data, player) if stash.owner then if stash.owner == true then - owner = data.owner or player.owner + owner = data.owner or player?.owner else owner = stash.owner end @@ -224,6 +199,7 @@ local function loadInventoryData(data, player) end if data.netid then + inventory.entityId = data.entityId or NetworkGetEntityFromNetworkId(data.netid) inventory.netid = data.netid end @@ -235,7 +211,7 @@ setmetatable(Inventory, { if not inv then return self elseif type(inv) == 'table' then - if inv.items then return inv end + if inv.__index then return inv end return not inv.owner and Inventories[inv.id] or loadInventoryData(inv, player) end @@ -267,7 +243,7 @@ exports('GetInventory', getInventory) ---@param owner? string | number ---@return table? exports('GetInventoryItems', function(inv, owner) - return getInventory(inv, owner).items + return getInventory(inv, owner)?.items end) ---@param inv inventory @@ -312,7 +288,9 @@ function Inventory.CloseAll(inv, ignoreId) for playerId in pairs(inv.openedBy) do local playerInv = Inventory(playerId) - if playerInv and (not ignoreId or playerId ~= ignoreId) then playerInv:closeInventory() end + if playerInv and playerId ~= ignoreId then + playerInv:closeInventory() + end end end @@ -329,7 +307,7 @@ function Inventory.Set(inv, k, v) if inv.type ~= 'player' then if inv.player then inv.type = 'player' - elseif inv.type == 'drop' and not next(inv.items) then + elseif inv.type == 'drop' and not next(inv.items) and not next(inv.openedBy) then return Inventory.Remove(inv) else inv.time = os.time() @@ -356,8 +334,14 @@ function Inventory.Get(inv, key) end end +---@class MinimalInventorySlot +---@field name string +---@field count number +---@field slot number +---@field metadata? table + ---@param inv inventory ----@return table items table containing minimal inventory data +---@return MinimalInventorySlot[] items local function minimal(inv) inv = Inventory(inv) --[[@as OxInventory]] local inventory, count = {}, 0 @@ -408,57 +392,28 @@ function Inventory.SetSlot(inv, item, count, metadata, slot) return currentSlot end -local Items +local Items = require 'modules.items.server' CreateThread(function() - TriggerEvent('ox_inventory:loadInventory', Inventory) - Items = require 'modules.items.server' - - -- Require "set inventory:weaponmismatch 1" to enable experimental weapon checks. - -- Maybe need some tweaks, and will definitely need more hashes added to the ignore list. - -- May even use weaponDamageEvent, depending on performance.. - -- if GetConvarInt('inventory:weaponmismatch', 0) == 0 then return end - - -- Disable this loop, client-side handling should be "good enough". - do return end - - local ignore = { - [0] = 1, -- GetSelectedPedWeapon returns 0 when using a firetruk; likely some other cases - [966099553] = 1, -- I don't know - [`WEAPON_UNARMED`] = 1, - [`WEAPON_ANIMAL`] = 1, - [`WEAPON_COUGAR`] = 1, - } - - while true do - Wait(30000) - - for id, inv in pairs(Inventories) do - if inv.player then - local hash = GetSelectedPedWeapon(inv.player.ped) + Inventory.accounts = server.accounts + TriggerEvent('ox_inventory:loadInventory', Inventory) +end) - if not ignore[hash] then - local currentWeapon = inv.items[inv.weapon].name +function Inventory.GetAccountItemCounts(inv) + inv = Inventory(inv) - if currentWeapon then - local currentHash = Items(currentWeapon).hash + if not inv then return end - if currentHash ~= hash then - inv.weapon = nil - print(('Player.%s weapon mismatch (%s). Current weapon: %s (%s)'):format(id, hash, currentWeapon, currentHash)) - end - else - print(('Player.%s weapon mismatch (%s)'):format(id, hash, currentWeapon)) - end + local accounts = table.clone(server.accounts) - if not inv.weapon then - TriggerClientEvent('ox_inventory:disarm', id) - end - end - end + for _, v in pairs(inv.items) do + if accounts[v.name] then + accounts[v.name] += v.count end end -end) + + return accounts +end ---@param item table ---@param slot table @@ -468,7 +423,7 @@ function Inventory.SlotWeight(item, slot, ignoreCount) if not slot.metadata then slot.metadata = {} end if item.ammoname and slot.metadata.ammo then - local ammoWeight = Items(item.ammoname).weight + local ammoWeight = Items(item.ammoname)?.weight if ammoWeight then weight += (ammoWeight * slot.metadata.ammo) @@ -477,7 +432,7 @@ function Inventory.SlotWeight(item, slot, ignoreCount) if slot.metadata.components then for i = #slot.metadata.components, 1, -1 do - local componentWeight = Items(slot.metadata.components[i]).weight + local componentWeight = Items(slot.metadata.components[i])?.weight if componentWeight then weight += componentWeight @@ -511,12 +466,32 @@ local function hasActiveInventory(playerId, owner) local activePlayer = activeIdentifiers[owner] if activePlayer then + if activePlayer == playerId then + error('attempted to load active player\'s inventory a secondary time', 0) + end + local inventory = Inventory(activePlayer) if inventory then - if GetPlayerEndpoint(activePlayer) then + local endpoint = GetPlayerEndpoint(activePlayer) + + if endpoint then DropPlayer(playerId, ("Character identifier '%s' is already active."):format(owner)) + -- Supposedly still getting stuck? Print info and hope somebody reports back (lol) + print(('kicked player.%s (charid is already in use)'):format(playerId), json.encode({ + oldId = activePlayer, + newId = playerId, + charid = owner, + endpoint = endpoint, + playerName = GetPlayerName(activePlayer), + fivem = GetPlayerIdentifierByType(activePlayer, 'fivem'), + license = GetPlayerIdentifierByType(activePlayer, 'license2') or GetPlayerIdentifierByType(activePlayer, 'license'), + }, { + indent = true, + sort_keys = true + })) + return true end @@ -530,6 +505,41 @@ local function hasActiveInventory(playerId, owner) activeIdentifiers[owner] = playerId end +---Manually clear an inventory state tied to the given identifier. +---Temporary workaround until somebody actually gives me info. +RegisterCommand('clearActiveIdentifier', function(source, args) + ---Server console only. + if source ~= 0 then return end + + local activePlayer = activeIdentifiers[args[1]] or activeIdentifiers[tonumber(args[1])] + local inventory = activePlayer and Inventory(activePlayer) + + if not inventory then return end + + local endpoint = GetPlayerEndpoint(activePlayer) + + if endpoint then + DropPlayer(activePlayer, 'Kicked') + + -- Supposedly still getting stuck? Print info and hope somebody reports back (lol) + print(('kicked player.%s (clearActiveIdentifier)'):format(activePlayer), json.encode({ + oldId = activePlayer, + charid = inventory.owner, + endpoint = endpoint, + playerName = GetPlayerName(activePlayer), + fivem = GetPlayerIdentifierByType(activePlayer, 'fivem'), + license = GetPlayerIdentifierByType(activePlayer, 'license2') or GetPlayerIdentifierByType(activePlayer, 'license'), + }, { + indent = true, + sort_keys = true + })) + end + + Inventory.CloseAll(inventory) + db.savePlayer(inventory.owner, json.encode(inventory:minimal())) + Inventory.Remove(inventory) +end, true) + ---@param id string|number ---@param label string|nil ---@param invType string @@ -538,10 +548,11 @@ end ---@param maxWeight number ---@param owner string | number | boolean ---@param items? table +---@param dbId? string | number ---@return OxInventory? --- This should only be utilised internally! --- To create a stash, please use `exports.ox_inventory:RegisterStash` instead. -function Inventory.Create(id, label, invType, slots, weight, maxWeight, owner, items, groups) +function Inventory.Create(id, label, invType, slots, weight, maxWeight, owner, items, groups, dbId) if invType == 'player' and hasActiveInventory(id, owner) then return end local self = { @@ -560,9 +571,10 @@ function Inventory.Create(id, label, invType, slots, weight, maxWeight, owner, i time = os.time(), groups = groups, openedBy = {}, + dbId = dbId } - if invType == 'drop' or invType == 'temp' then + if invType == 'drop' or invType == 'temp' or invType == 'dumpster' then self.datastore = true else self.changed = false @@ -573,18 +585,11 @@ function Inventory.Create(id, label, invType, slots, weight, maxWeight, owner, i if invType ~= 'player' and owner and type(owner) ~= 'boolean' then self.id = ('%s:%s'):format(self.id, owner) end - else - if Ox then - self.dbId = id - self.id = (invType == 'glovebox' and 'glove' or invType)..label - else - self.dbId = label - end end end if not items then - self.items, self.weight, self.datastore = Inventory.Load(self.dbId, invType, owner) + self.items, self.weight = Inventory.Load(self.dbId, invType, owner) elseif weight == 0 and next(items) then self.weight = Inventory.CalculateWeight(items) end @@ -605,10 +610,26 @@ function Inventory.Remove(inv) activeIdentifiers[inv.owner] = nil end + for playerId in pairs(inv.openedBy) do + if inv.id ~= playerId then + local target = Inventories[playerId] + + if target then + target:closeInventory() + end + end + end + + if not inv.datastore and inv.changed then + Inventory.Save(inv) + end + Inventories[inv.id] = nil end end +exports('RemoveInventory', Inventory.Remove) + ---Update the internal reference to vehicle stashes. Does not trigger a save or update the database. ---@param oldPlate string ---@param newPlate string @@ -650,22 +671,34 @@ exports('UpdateVehicle', Inventory.UpdateVehicle) function Inventory.Save(inv) inv = Inventory(inv) --[[@as OxInventory]] - if inv then - local items = json.encode(minimal(inv)) - inv.changed = false + if not inv or inv.datastore then return end - if inv.player then - db.savePlayer(inv.owner, items) - else - if inv.type == 'trunk' then - db.saveTrunk(inv.dbId, items) - elseif inv.type == 'glovebox' then - db.saveGlovebox(inv.dbId, items) - else - db.saveStash(inv.owner, inv.dbId, items) - end - end - end + local buffer, n = {}, 0 + + for k, v in pairs(inv.items) do + if not Items.UpdateDurability(inv, v, Items(v.name), nil, os.time()) then + n += 1 + buffer[n] = { + name = v.name, + count = v.count, + slot = k, + metadata = next(v.metadata) and v.metadata or nil + } + end + end + + local data = next(buffer) and json.encode(buffer) or nil + inv.changed = false + + if inv.player then + return shared.framework ~= 'esx' and db.savePlayer(inv.owner, data) + elseif inv.type == 'trunk' then + return db.saveTrunk(inv.dbId, data) + elseif inv.type == 'glovebox' then + return db.saveGlovebox(inv.dbId, data) + end + + return db.saveStash(inv.owner, inv.dbId, data) end local function randomItem(loot, items, size) @@ -701,7 +734,7 @@ end ---@param inv inventory ---@param invType string ---@param items? table ----@return table returnData, number totalWeight, boolean true +---@return table returnData, number totalWeight local function generateItems(inv, invType, items) if items == nil then if invType == 'dumpster' then @@ -729,35 +762,33 @@ local function generateItems(inv, invType, items) end end - return returnData, totalWeight, true + return returnData, totalWeight end ---@param id string|number ---@param invType string ---@param owner string | number | boolean function Inventory.Load(id, invType, owner) - local datastore, result + if not invType then return end - if id and invType then - if invType == 'dumpster' then - if server.randomloot then - return generateItems(id, invType) - else - datastore = true - end - elseif invType == 'trunk' or invType == 'glovebox' then - result = invType == 'trunk' and db.loadTrunk(id) or db.loadGlovebox(id) + local result - if not result then - if server.randomloot then - return generateItems(id, 'vehicle') - else - datastore = true - end - else result = result[invType] end - else - result = db.loadStash(owner or '', id) + if invType == 'trunk' or invType == 'glovebox' then + result = id and (invType == 'trunk' and db.loadTrunk(id) or db.loadGlovebox(id)) + + if not result then + if server.randomloot then + return generateItems(id, 'vehicle') + end + else + result = result[invType] + end + elseif invType == 'dumpster' then + if server.randomloot then + return generateItems(id, invType) end + elseif id then + result = db.loadStash(owner or '', id) end local returnData, weight = {}, 0 @@ -780,11 +811,9 @@ function Inventory.Load(id, invType, owner) end end - return returnData, weight, datastore + return returnData, weight end -local table = lib.table - local function assertMetadata(metadata) if metadata and type(metadata) ~= 'table' then metadata = metadata and { type = metadata or nil } @@ -811,13 +840,8 @@ function Inventory.GetItem(inv, item, metadata, returnsCount) metadata = assertMetadata(metadata) for _, v in pairs(inv.items) do - if v and v.name == item.name and (not metadata or table.contains(v.metadata, metadata)) then - count += v.count - local durability = v.metadata.durability - - if durability and durability > 100 and ostime >= durability then - v.metadata.durability = 0 - end + if v.name == item.name and (not metadata or table.contains(v.metadata, metadata)) and not Items.UpdateDurability(inv, v, item, nil, ostime) then + count += v.count end end end @@ -886,7 +910,7 @@ exports('SetItem', Inventory.SetItem) function Inventory.GetCurrentWeapon(inv) inv = Inventory(inv) --[[@as OxInventory]] - if inv.player then + if inv?.player then local weapon = inv.items[inv.weapon] if weapon and Items(weapon.name).weapon then @@ -899,96 +923,79 @@ end exports('GetCurrentWeapon', Inventory.GetCurrentWeapon) ---@param inv inventory ----@param slot number +---@param slotId number ---@return table? item -function Inventory.GetSlot(inv, slot) +function Inventory.GetSlot(inv, slotId) inv = Inventory(inv) --[[@as OxInventory]] - local slotData = inv and inv.items[slot] + local slot = inv and inv.items[slotId] - if slotData then - local durability = slotData.metadata.durability - - if durability and durability > 100 and os.time() >= durability then - slotData.metadata.durability = 0 - end - - return slotData + if slot and not Items.UpdateDurability(inv, slot, Items(slot.name), nil, os.time()) then + return slot end end exports('GetSlot', Inventory.GetSlot) ---@param inv inventory ----@param slot number -function Inventory.SetDurability(inv, slot, durability) +---@param slotId number +function Inventory.SetDurability(inv, slotId, durability) inv = Inventory(inv) --[[@as OxInventory]] - local slotData = inv and inv.items[slot] + local slot = inv and inv.items[slotId] - if inv and slotData then - inv.changed = true - slotData.metadata.durability = durability + if not slot then return end - if inv.player and server.syncInventory then - server.syncInventory(inv) - end + Items.UpdateDurability(inv, slot, Items(slot.name), durability) - inv:syncSlotsWithClients({ - { - item = slotData, - inventory = inv.id - } - }, - { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil - }, true) - end + if inv.player and server.syncInventory then + server.syncInventory(inv) + end end exports('SetDurability', Inventory.SetDurability) local Utils = require 'modules.utils.server' ---@param inv inventory ----@param slot number | false +---@param slotId number ---@param metadata { [string]: any } -function Inventory.SetMetadata(inv, slot, metadata) +function Inventory.SetMetadata(inv, slotId, metadata) inv = Inventory(inv) --[[@as OxInventory]] - local slotData = inv and type(slot) == 'number' and inv.items[slot] + local slot = inv and inv.items[slotId] - if inv and slotData then - inv.changed = true - local imageurl = slotData.metadata.imageurl - slotData.metadata = type(metadata) == 'table' and metadata or { type = metadata or nil } + if not slot then return end - if metadata.weight then - inv.weight -= slotData.weight - slotData.weight = Inventory.SlotWeight(Items(slotData.name), slotData) - inv.weight += slotData.weight - end + local item = Items(slot.name) + local imageurl = slot.metadata.imageurl + slot.metadata = type(metadata) == 'table' and metadata or { type = metadata or nil } + inv.changed = true - if inv.player and server.syncInventory then - server.syncInventory(inv) - end + if metadata.weight then + inv.weight -= slot.weight + slot.weight = Inventory.SlotWeight(item, slot) + inv.weight += slot.weight + end - inv:syncSlotsWithClients({ - { - item = slotData, - inventory = inv.id - } - }, - { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil - }, true) + if metadata.durability ~= slot.metadata.durability then + Items.UpdateDurability(inv, slot, item, metadata.durability) + else + inv:syncSlotsWithClients({ + { + item = slot, + inventory = inv.id + } + }, true) + end - if metadata.imageurl ~= imageurl and Utils.IsValidImageUrl then - if Utils.IsValidImageUrl(metadata.imageurl) then - Utils.DiscordEmbed('Valid image URL', ('Updated item "%s" (%s) with valid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slotData.label, slotData.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 65280) - else - Utils.DiscordEmbed('Invalid image URL', ('Updated item "%s" (%s) with invalid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slotData.label, slotData.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 16711680) - metadata.imageurl = nil - end - end - end + if inv.player and server.syncInventory then + server.syncInventory(inv) + end + + if metadata.imageurl ~= imageurl and Utils.IsValidImageUrl then + if Utils.IsValidImageUrl(metadata.imageurl) then + Utils.DiscordEmbed('Valid image URL', ('Updated item "%s" (%s) with valid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slot.label, slot.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 65280) + else + Utils.DiscordEmbed('Invalid image URL', ('Updated item "%s" (%s) with invalid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slot.label, slot.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 16711680) + metadata.imageurl = nil + end + end end exports('SetMetadata', Inventory.SetMetadata) @@ -1003,6 +1010,16 @@ function Inventory.SetSlotCount(inv, slots) inv.changed = true inv.slots = slots + + if inv.player then + TriggerClientEvent('ox_inventory:refreshSlotCount', inv.id, {inventoryId = inv.id, slots = inv.slots}) + end + + for playerId in pairs(inv.openedBy) do + if playerId ~= inv.id then + TriggerClientEvent('ox_inventory:refreshSlotCount', playerId, {inventoryId = inv.id, slots = inv.slots}) + end + end end exports('SetSlotCount', Inventory.SetSlotCount) @@ -1016,9 +1033,16 @@ function Inventory.SetMaxWeight(inv, maxWeight) if type(maxWeight) ~= 'number' then return end inv.maxWeight = maxWeight - if not inv.open then return end - TriggerClientEvent('refreshMaxWeight', inv.open, {inventoryId = inv.id, maxWeight = inv.maxWeight}) + if inv.player then + TriggerClientEvent('ox_inventory:refreshMaxWeight', inv.id, {inventoryId = inv.id, maxWeight = inv.maxWeight}) + end + + for playerId in pairs(inv.openedBy) do + if playerId ~= inv.id then + TriggerClientEvent('ox_inventory:refreshMaxWeight', playerId, {inventoryId = inv.id, maxWeight = inv.maxWeight}) + end + end end exports('SetMaxWeight', Inventory.SetMaxWeight) @@ -1037,7 +1061,7 @@ function Inventory.AddItem(inv, item, count, metadata, slot, cb) inv = Inventory(inv) --[[@as OxInventory]] - if not inv.slots then return false, 'invalid_inventory' end + if not inv?.slots then return false, 'invalid_inventory' end local toSlot, slotMetadata, slotCount local success, response = false @@ -1099,10 +1123,6 @@ function Inventory.AddItem(inv, item, count, metadata, slot, cb) item = inv.items[toSlot], inventory = inv.id } - }, - { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil }, true) if invokingResource then @@ -1125,10 +1145,7 @@ function Inventory.AddItem(inv, item, count, metadata, slot, cb) server.syncInventory(inv) end - inv:syncSlotsWithClients(toSlot, { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil - }, true) + inv:syncSlotsWithClients(toSlot, true) if invokingResource then lib.logger(inv.owner, 'addItem', ('"%s" added %sx %s to "%s"'):format(invokingResource, added, item.name, inv.label)) @@ -1208,7 +1225,7 @@ exports('Search', Inventory.Search) function Inventory.GetItemSlots(inv, item, metadata) inv = Inventory(inv) --[[@as OxInventory]] - if not inv.slots then return end + if not inv?.slots then return end local totalCount, slots, emptySlots = 0, {}, inv.slots @@ -1246,7 +1263,7 @@ function Inventory.RemoveItem(inv, item, count, metadata, slot, ignoreTotal) if count > 0 then inv = Inventory(inv) --[[@as OxInventory]] - if not inv.slots then return false, 'invalid_inventory' end + if not inv?.slots then return false, 'invalid_inventory' end metadata = assertMetadata(metadata) local itemSlots, totalCount = Inventory.GetItemSlots(inv, item, metadata) @@ -1306,10 +1323,7 @@ function Inventory.RemoveItem(inv, item, count, metadata, slot, ignoreTotal) array[k] = {item = type(v) == 'number' and { slot = v } or v, inventory = inv.id} end - inv:syncSlotsWithClients(array, { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil - }, true) + inv:syncSlotsWithClients(array, true) local invokingResource = server.loglevel > 1 and GetInvokingResource() @@ -1434,14 +1448,11 @@ end local function CustomDrop(prefix, items, coords, slots, maxWeight, instance, model) local dropId = generateInvId() - local inventory = Inventory.Create(dropId, ('%s %s'):format(prefix, dropId:gsub('%D', '')), 'drop', slots or shared.playerslots, 0, maxWeight or shared.playerweight, false) + local inventory = Inventory.Create(dropId, ('%s %s'):format(prefix, dropId:gsub('%D', '')), 'drop', slots or shared.playerslots, 0, maxWeight or shared.playerweight, false, {}) if not inventory then return end - local items, weight = generateItems(inventory, 'drop', items) - - inventory.items = items - inventory.weight = weight + inventory.items, inventory.weight = generateItems(inventory, 'drop', items) inventory.coords = coords Inventory.Drops[dropId] = { coords = inventory.coords, @@ -1450,6 +1461,8 @@ local function CustomDrop(prefix, items, coords, slots, maxWeight, instance, mod } TriggerClientEvent('ox_inventory:createDrop', -1, dropId, Inventory.Drops[dropId]) + + return dropId end AddEventHandler('ox_inventory:customDrop', CustomDrop) @@ -1480,14 +1493,28 @@ end) local TriggerEventHooks = require 'modules.hooks.server' -local function dropItem(source, data) - local playerInventory = Inventory(source) +---@class SwapSlotData +---@field count number +---@field fromSlot number +---@field toSlot number +---@field instance any +---@field fromType string +---@field toType string +---@field coords? vector3 - if not playerInventory then return end +---@param source number +---@param playerInventory OxInventory +---@param fromData SlotWithItem? +---@param data SwapSlotData +local function dropItem(source, playerInventory, fromData, data) + if not fromData then return end - local fromData = playerInventory.items[data.fromSlot] + local toData = table.clone(fromData) + toData.slot = data.toSlot + toData.count = data.count + toData.weight = Inventory.SlotWeight(Items(toData.name), toData) - if not fromData then return end + if toData.weight > shared.playerweight then return end if not TriggerEventHooks('swapItems', { source = source, @@ -1498,21 +1525,20 @@ local function dropItem(source, data) toSlot = data.toSlot, toType = 'drop', count = data.count, + action = 'move', }) then return end - if data.count > fromData.count then data.count = fromData.count end - - local toData = table.clone(fromData) - toData.slot = data.toSlot - toData.count = data.count - fromData.count -= data.count - fromData.weight = Inventory.SlotWeight(Items(fromData.name), fromData) - toData.weight = Inventory.SlotWeight(Items(toData.name), toData) + fromData.count -= data.count + fromData.weight = Inventory.SlotWeight(Items(fromData.name), fromData) - if fromData.count < 1 then fromData = nil end + if fromData.count < 1 then + fromData = nil + else + toData.metadata = table.clone(toData.metadata) + end - playerInventory.weight -= toData.weight local slot = data.fromSlot + playerInventory.weight -= toData.weight playerInventory.items[slot] = fromData if slot == playerInventory.weapon then @@ -1549,13 +1575,11 @@ end local activeSlots = {} +---@param source number +---@param data SwapSlotData lib.callback.register('ox_inventory:swapItems', function(source, data) if data.count < 1 then return end - if data.toType == 'newdrop' then - return dropItem(source, data) - end - local playerInventory = Inventory(source) if not playerInventory then return end @@ -1568,6 +1592,8 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) return end + if data.toType == 'inspect' or data.fromType == 'inspect' then return end + local fromRef = ('%s:%s'):format(fromInventory.id, data.fromSlot) local toRef = ('%s:%s'):format(toInventory.id, data.toSlot) @@ -1587,7 +1613,6 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) local sameInventory = fromInventory.id == toInventory.id local fromOtherPlayer = fromInventory.player and fromInventory ~= playerInventory local toOtherPlayer = toInventory.player and toInventory ~= playerInventory - local toData = toInventory.items[data.toSlot] if not sameInventory and (fromInventory.type == 'policeevidence' or (toInventory.type == 'policeevidence' and toData)) then @@ -1606,7 +1631,7 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) activeSlots[toRef] = nil end) - if toInventory and fromInventory and (fromInventory.id ~= toInventory.id or data.fromSlot ~= data.toSlot) then + if toInventory and (data.toType == 'newdrop' or fromInventory ~= toInventory or data.fromSlot ~= data.toSlot) then local fromData = fromInventory.items[data.fromSlot] if not fromData then @@ -1622,8 +1647,17 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) } end - if fromData and (not fromData.metadata.container or fromData.metadata.container and toInventory.type ~= 'container') then - if data.count > fromData.count then data.count = fromData.count end + if data.count > fromData.count then + data.count = fromData.count + end + + if data.toType == 'newdrop' then + return dropItem(source, playerInventory, fromData, data) + end + + if fromData then + if fromData.metadata.container and toInventory.type == 'container' then return false end + if toData and toData.metadata.container and fromInventory.type == 'container' then return false end local container, containerItem = (not sameInventory and playerInventory.containerSlot) and (fromInventory.type == 'container' and fromInventory or toInventory) @@ -1654,15 +1688,15 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) if containerItem then local toContainer = toInventory.type == 'container' - local whitelist = Items.containers[containerItem.name].whitelist - local blacklist = Items.containers[containerItem.name].blacklist + local whitelist = Items.containers[containerItem.name]?.whitelist + local blacklist = Items.containers[containerItem.name]?.blacklist local checkItem = toContainer and fromData.name or toData.name if (whitelist and not whitelist[checkItem]) or (blacklist and blacklist[checkItem]) then return end - Inventory.ContainerWeight(containerItem, toContainer and fromWeight or toWeight, playerInventory) + Inventory.ContainerWeight(containerItem, toContainer and toWeight or fromWeight, playerInventory) end if fromOtherPlayer then @@ -1748,8 +1782,8 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) if container then if toContainer and containerItem then - local whitelist = Items.containers[containerItem.name].whitelist - local blacklist = Items.containers[containerItem.name].blacklist + local whitelist = Items.containers[containerItem.name]?.whitelist + local blacklist = Items.containers[containerItem.name]?.blacklist if (whitelist and not whitelist[fromData.name]) or (blacklist and blacklist[fromData.name]) then return @@ -1813,32 +1847,34 @@ lib.callback.register('ox_inventory:swapItems', function(source, data) if fromInventory.changed ~= nil then fromInventory.changed = true end if toInventory.changed ~= nil then toInventory.changed = true end - if sameInventory then - fromInventory:syncSlotsWithClients({ - { - item = fromInventory.items[data.toSlot] or { slot = data.toSlot }, - inventory = fromInventory.id - }, - { - item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot }, - inventory = fromInventory.id - } - }, { left = fromInventory.weight }, true) - else - toInventory:syncSlotsWithClients({ - { - item = toInventory.items[data.toSlot] or { slot = data.toSlot }, - inventory = toInventory.id - } - }, { left = toInventory.weight }, true) - - fromInventory:syncSlotsWithClients({ - { - item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot }, - inventory = fromInventory.id - } - }, { left = fromInventory.weight }, true) - end + CreateThread(function() + if sameInventory then + fromInventory:syncSlotsWithClients({ + { + item = fromInventory.items[data.toSlot] or { slot = data.toSlot }, + inventory = fromInventory.id + }, + { + item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot }, + inventory = fromInventory.id + } + }, true) + else + toInventory:syncSlotsWithClients({ + { + item = toInventory.items[data.toSlot] or { slot = data.toSlot }, + inventory = toInventory.id + } + }, true) + + fromInventory:syncSlotsWithClients({ + { + item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot }, + inventory = fromInventory.id + } + }, true) + end + end) local resp @@ -1886,7 +1922,7 @@ end) function Inventory.Confiscate(source) local inv = Inventories[source] - if inv.player then + if inv?.player then db.saveStash(inv.owner, inv.owner, json.encode(minimal(inv))) table.wipe(inv.items) inv.weight = 0 @@ -1902,37 +1938,41 @@ exports('ConfiscateInventory', Inventory.Confiscate) function Inventory.Return(source) local inv = Inventories[source] - if inv.player then - MySQL.scalar('SELECT data FROM ox_inventory WHERE name = ?', { inv.owner }, function(data) - if data then - MySQL.query('DELETE FROM ox_inventory WHERE name = ?', { inv.owner }) - data = json.decode(data) - local inventory, totalWeight = {}, 0 - - if data and next(data) then - for i = 1, #data do - local i = data[i] - if type(i) == 'number' then break end - local item = Items(i.name) - if item then - local weight = Inventory.SlotWeight(item, i) - totalWeight = totalWeight + weight - inventory[i.slot] = {name = i.name, label = item.label, weight = weight, slot = i.slot, count = i.count, description = item.description, metadata = i.metadata, stack = item.stack, close = item.close} - end - end - end + if not inv?.player then return end - inv.changed = true - inv.weight = totalWeight - inv.items = inventory + local items = MySQL.scalar.await('SELECT data FROM ox_inventory WHERE name = ?', { inv.owner }) - TriggerClientEvent('ox_inventory:inventoryReturned', source, {inventory, totalWeight}) + if not items then return end - if server.syncInventory then server.syncInventory(inv) end - end - end) - end + MySQL.update.await('DELETE FROM ox_inventory WHERE name = ?', { inv.owner }) + + items = json.decode(items) + local inventory, totalWeight = {}, 0 + + if table.type(items) == 'array' then + for i = 1, #items do + local data = items[i] + if type(data) == 'number' then break end + + local item = Items(data.name) + + if item then + local weight = Inventory.SlotWeight(item, data) + totalWeight = totalWeight + weight + inventory[data.slot] = {name = data.name, label = item.label, weight = weight, slot = data.slot, count = data.count, description = item.description, metadata = data.metadata, stack = item.stack, close = item.close} + end + end + end + + inv.changed = true + inv.weight = totalWeight + inv.items = inventory + + TriggerClientEvent('ox_inventory:inventoryReturned', source, { inventory, totalWeight }) + + if server.syncInventory then server.syncInventory(inv) end end + exports('ReturnInventory', Inventory.Return) ---@param inv inventory @@ -1995,10 +2035,7 @@ function Inventory.Clear(inv, keep) inv.weight = newWeight inv.changed = true - inv:syncSlotsWithClients(updateSlots, { - left = inv.weight, - right = inv.open and Inventories[inv.open].weight or nil - }, true) + inv:syncSlotsWithClients(updateSlots, true) if not inv.player then if inv.open then @@ -2083,13 +2120,9 @@ function Inventory.GetSlotWithItem(inv, itemName, metadata, strict) for _, slotData in pairs(inventory.items) do if slotData and slotData.name == item.name and (not metadata or tablematch(slotData.metadata, metadata)) then - local durability = slotData.metadata.durability - - if durability and durability > 100 and os.time() >= durability then - slotData.metadata.durability = 0 - end - - return slotData + if not Items.UpdateDurability(inventory, slotData, item, nil, os.time()) then + return slotData + end end end end @@ -2102,7 +2135,7 @@ exports('GetSlotWithItem', Inventory.GetSlotWithItem) ---@param strict? boolean Strictly match metadata properties, otherwise use partial matching. ---@return number? function Inventory.GetSlotIdWithItem(inv, itemName, metadata, strict) - return Inventory.GetSlotWithItem(inv, itemName, metadata, strict).slot + return Inventory.GetSlotWithItem(inv, itemName, metadata, strict)?.slot end exports('GetSlotIdWithItem', Inventory.GetSlotIdWithItem) @@ -2122,19 +2155,13 @@ function Inventory.GetSlotsWithItem(inv, itemName, metadata, strict) local response = {} local n = 0 local tablematch = strict and table.matches or table.contains - local ostime = os.time() for _, slotData in pairs(inventory.items) do - if slotData and slotData.name == item.name and tablematch(slotData.metadata, metadata) then - n += 1 - - local durability = slotData.metadata.durability - - if durability and durability > 100 and ostime >= durability then - slotData.metadata.durability = 0 - end - - response[n] = slotData + if slotData and slotData.name == item.name and (not metadata or tablematch(slotData.metadata, metadata)) then + if not Items.UpdateDurability(inventory, slotData, item, nil, os.time()) then + n += 1 + response[n] = slotData + end end end @@ -2161,6 +2188,8 @@ function Inventory.GetSlotIdsWithItem(inv, itemName, metadata, strict) end end +exports('GetSlotIdsWithItem', Inventory.GetSlotIdsWithItem) + ---@param inv inventory ---@param itemName string ---@param metadata? any @@ -2187,94 +2216,143 @@ end exports('GetItemCount', Inventory.GetItemCount) -local function prepareSave(inv) - inv.changed = false +---@alias InventorySaveData { [1]: MinimalInventorySlot, [2]: string | number, [3]: string | number | nil } - if inv.player then - if shared.framework ~= 'esx' then - return 1, { json.encode(minimal(inv)), inv.owner } - end - elseif inv.type == 'trunk' then - return 2, { json.encode(minimal(inv)), inv.dbId } - elseif inv.type == 'glovebox' then - return 3, { json.encode(minimal(inv)), inv.dbId } - else - return 4, { inv.owner or '', inv.dbId, json.encode(minimal(inv)) } +---@param inv OxInventory +---@param buffer table +---@param time integer +---@return integer? +---@return InventorySaveData? +local function prepareInventorySave(inv, buffer, time) + local shouldSave = not inv.datastore and inv.changed + local n = 0 + + for k, v in pairs(inv.items) do + if not Items.UpdateDurability(inv, v, Items(v.name), nil, time) and shouldSave then + n += 1 + buffer[n] = { + name = v.name, + count = v.count, + slot = k, + metadata = next(v.metadata) and v.metadata or nil + } + end end + + if not shouldSave then return end + + local data = next(buffer) and json.encode(buffer) or nil + inv.changed = false + table.wipe(buffer) + + if inv.player then + if shared.framework == 'esx' then return end + + return 1, { data, inv.owner } + end + + if inv.type == 'trunk' then + return 2, { data, inv.dbId } + end + + if inv.type == 'glovebox' then + return 3, { data, inv.dbId } + end + + return 4, { data, inv.owner and tostring(inv.owner) or '', inv.dbId } end -lib.cron.new('*/5 * * * *', function() +local isSaving = false +local inventoryClearTime = GetConvarInt('inventory:cleartime', 5) * 60 + +local function saveInventories(clearInventories) + if isSaving then return end + + isSaving = true local time = os.time() local parameters = { {}, {}, {}, {} } - local size = { 0, 0, 0, 0 } + local total = { 0, 0, 0, 0, 0 } + local buffer = {} for _, inv in pairs(Inventories) do - if not inv.open then - if not inv.datastore and inv.changed then - local i, data = prepareSave(inv) + local index, data = prepareInventorySave(inv, buffer, time) - if i then - size[i] += 1 - parameters[i][size[i]] = data - end - end + if index and data then + total[5] += 1 - if inv.datastore and inv.netid and (inv.type == 'trunk' or inv.type == 'glovebox') then - if NetworkGetEntityFromNetworkId(inv.netid) == 0 then - Inventory.Remove(inv) - end - elseif not inv.player and (inv.datastore or inv.owner) and time - inv.time >= 1200 then - -- inv.time is a timestamp for when the inventory was last closed - -- if unopened for n seconds, the inventory is unloaded (datastore/temp stash is deleted) - Inventory.Remove(inv) - end - end + if index == 4 and server.bulkstashsave then + for i = 1, 3 do + total[index] += 1 + parameters[index][total[index]] = data[i] + end + else + total[index] += 1 + parameters[index][total[index]] = data + end + end end - db.saveInventories(parameters[1], parameters[2], parameters[3], parameters[4]) + if total[5] > 0 then + db.saveInventories(parameters[1], parameters[2], parameters[3], parameters[4], total) + end + + isSaving = false + + if not clearInventories then return end + + for _, inv in pairs(Inventories) do + if not inv.open and not inv.player then + -- clear inventory from memory if unused for x minutes, or on entity/netid mismatch + if inv.type == 'glovebox' or inv.type == 'trunk' then + if NetworkGetEntityFromNetworkId(inv.netid) ~= inv.entityId then + Inventory.Remove(inv) + end + elseif time - inv.time >= inventoryClearTime then + Inventory.Remove(inv) + end + end + end +end + +lib.cron.new('*/5 * * * *', function() + saveInventories(true) end) -function Inventory.SaveInventories(lock) - local parameters = { {}, {}, {}, {} } - local size = { 0, 0, 0, 0 } +function Inventory.SaveInventories(lock, clearInventories) Inventory.Lock = lock or nil Inventory.CloseAll() - - for _, inv in pairs(Inventories) do - if not inv.datastore and inv.changed then - local i, data = prepareSave(inv) - - if i then - size[i] += 1 - parameters[i][size[i]] = data - end - end - end - - db.saveInventories(parameters[1], parameters[2], parameters[3], parameters[4]) + saveInventories(clearInventories) end AddEventHandler('playerDropped', function() + server.playerDropped(source) + if GetNumPlayerIndices() == 0 then - Inventory.SaveInventories() + Inventory.SaveInventories(false, true) end end) AddEventHandler('txAdmin:events:serverShuttingDown', function() - Inventory.SaveInventories(true) + Inventory.SaveInventories(true, false) +end) + +AddEventHandler('txAdmin:events:scheduledRestart', function(eventData) + if eventData.secondsRemaining ~= 60 then return end + + Inventory.SaveInventories(true, true) end) AddEventHandler('onResourceStop', function(resource) if resource == shared.resource then - Inventory.SaveInventories(true) + Inventory.SaveInventories(true, false) end end) RegisterServerEvent('ox_inventory:closeInventory', function() local inventory = Inventories[source] - if inventory.open then + if inventory?.open then local secondary = Inventories[inventory.open] if secondary then @@ -2291,14 +2369,14 @@ RegisterServerEvent('ox_inventory:giveItem', function(slot, target, count) if count <= 0 then count = 1 end - if toInventory.player then + if toInventory?.player then local data = fromInventory.items[slot] if not data then return end local item = Items(data.name) - if not item or data.count < count or not Inventory.CanCarryItem(toInventory, item, count, data.metadata) then + if not item or data.count < count or not Inventory.CanCarryItem(toInventory, item, count, data.metadata) or #(GetEntityCoords(fromInventory.player.ped) - GetEntityCoords(toInventory.player.ped)) > 15 then return TriggerClientEvent('ox_lib:notify', fromInventory.id, { type = 'error', description = locale('cannot_give', count, data.label) }) end @@ -2370,6 +2448,8 @@ local function updateWeapon(source, action, value, slot, specialAmmo) { item = item } }, inventory.weight) + if server.syncInventory then server.syncInventory(inventory) end + return true end end @@ -2389,7 +2469,7 @@ local function updateWeapon(source, action, value, slot, specialAmmo) if action == 'load' and weapon.metadata.durability > 0 then local ammo = Items(weapon.name).ammoname - local diff = value - weapon.metadata.ammo + local diff = value - (weapon.metadata.ammo or 0) if not Inventory.RemoveItem(inventory, ammo, diff, specialAmmo) then return end @@ -2426,6 +2506,10 @@ local function updateWeapon(source, action, value, slot, specialAmmo) weapon.metadata.durability = weapon.metadata.durability - ((Items(weapon.name).durability or 1) * value) end + if (weapon.metadata.durability or 0) < 0 then + weapon.metadata.durability = 0 + end + if action ~= 'throw' then inventory:syncSlotsWithPlayer({ { item = weapon } @@ -2472,8 +2556,6 @@ lib.callback.register('ox_inventory:removeAmmoFromWeapon', function(source, slot end end) -Inventory.accounts = server.accounts - local function checkStashProperties(properties) local name, slots, maxWeight, coords in properties @@ -2566,15 +2648,6 @@ end exports('RegisterStash', registerStash) ----@class TemporaryStashProperties ----@field label string ----@field slots number ----@field maxWeight number ----@field owner? string|number|boolean ----@field groups? table ----@field coords? vector3 ----@field items? { [number]: string, [number]: number, [number]: table | string }[] - ---@param properties TemporaryStashProperties function Inventory.CreateTemporaryStash(properties) properties.name = generateInvId('temp') @@ -2592,4 +2665,16 @@ end exports('CreateTemporaryStash', Inventory.CreateTemporaryStash) +function Inventory.InspectInventory(playerId, invId) + local inventory = invId ~= playerId and Inventory(invId) + local playerInventory = Inventory(playerId) + + if playerInventory and inventory then + playerInventory:openInventory(inventory) + TriggerClientEvent('ox_inventory:viewInventory', playerId, playerInventory, inventory) + end +end + +exports('InspectInventory', Inventory.InspectInventory) + return Inventory diff --git a/server-data/resources/[ox]/ox_inventory/modules/items/client.lua b/server-data/resources/[ox]/ox_inventory/modules/items/client.lua index 36004faa4..070b51f0b 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/items/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/items/client.lua @@ -2,14 +2,24 @@ if not lib then return end local Items = require 'modules.items.shared' --[[@as table]] +local function sendDisplayMetadata(data) + SendNUIMessage({ + action = 'displayMetadata', + data = data + }) +end + --- use array of single key value pairs to dictate order ---@param metadata string | table | table[] ---@param value? string local function displayMetadata(metadata, value) local data = {} - if type(metadata) == 'string' and value then data = { [1] = { metadata = metadata, value = value } } - elseif metadata[1] then -- assume its an array + if type(metadata) == 'string' then + if not value then return end + + data = { { metadata = metadata, value = value } } + elseif table.type(metadata) == 'array' then for i = 1, #metadata do for k, v in pairs(metadata[i]) do data[i] = { @@ -20,18 +30,24 @@ local function displayMetadata(metadata, value) end else for k, v in pairs(metadata) do - data[#data+1] = { + data[#data + 1] = { metadata = k, value = v, } end end - SendNUIMessage({ - action = 'displayMetadata', - data = data - }) + if client.uiLoaded then + return sendDisplayMetadata(data) + end + + CreateThread(function() + repeat Wait(100) until client.uiLoaded + + sendDisplayMetadata(data) + end) end + exports('displayMetadata', displayMetadata) ---@param _ table? @@ -61,7 +77,7 @@ setmetatable(Items --[[@as table]], { local function Item(name, cb) local item = Items[name] if item then - if not item.client.export and not item.client.event then + if not item.client?.export and not item.client?.event then item.effect = cb end end @@ -175,4 +191,4 @@ end) exports('Items', function(item) return getItem(nil, item) end) exports('ItemList', function(item) return getItem(nil, item) end) -return Items \ No newline at end of file +return Items diff --git a/server-data/resources/[ox]/ox_inventory/modules/items/containers.lua b/server-data/resources/[ox]/ox_inventory/modules/items/containers.lua index ddc8f449c..e8b510af2 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/items/containers.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/items/containers.lua @@ -27,20 +27,20 @@ local function setContainerProperties(itemName, properties) if blacklist then local tableType = table.type(blacklist) - if tableType == "array" then + if tableType == 'array' then blacklist = arrayToSet(blacklist) - elseif tableType ~= "hash" then - TypeError("blacklist", "table", type(blacklist)) + elseif tableType ~= 'hash' then + TypeError('blacklist', 'table', type(blacklist)) end end if whitelist then local tableType = table.type(whitelist) - if tableType == "array" then + if tableType == 'array' then whitelist = arrayToSet(whitelist) - elseif tableType ~= "hash" then - TypeError("whitelist", "table", type(whitelist)) + elseif tableType ~= 'hash' then + TypeError('whitelist', 'table', type(whitelist)) end end @@ -51,16 +51,16 @@ local function setContainerProperties(itemName, properties) } end -setContainerProperties("paperbag", { +setContainerProperties('paperbag', { slots = 5, maxWeight = 1000, - blacklist = { "testburger" }, + blacklist = { 'testburger' } }) -setContainerProperties("pizzabox", { +setContainerProperties('pizzabox', { slots = 5, maxWeight = 1000, - whitelist = { "pizza" }, + whitelist = { 'pizza' } }) return containers diff --git a/server-data/resources/[ox]/ox_inventory/modules/items/server.lua b/server-data/resources/[ox]/ox_inventory/modules/items/server.lua index 3d1b4d33e..ded5bcab1 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/items/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/items/server.lua @@ -25,17 +25,17 @@ local trash = { ---@param name string? ---@return table? local function getItem(_, name) - if name then - name = name:lower() + if not name then return ItemList end - if name:sub(0, 7) == 'weapon_' then - name = name:upper() - end + if type(name) ~= 'string' then return end - return ItemList[name] - end + name = name:lower() + + if name:sub(0, 7) == 'weapon_' then + name = name:upper() + end - return ItemList + return ItemList[name] end setmetatable(Items --[[@as table]], { @@ -219,12 +219,6 @@ CreateThread(function() Wait(500) end - local clearStashes = GetConvar('inventory:clearstashes', '6 MONTH') - - if clearStashes ~= '' then - pcall(MySQL.query.await, ('DELETE FROM ox_inventory WHERE lastupdated < (NOW() - INTERVAL %s) OR data = "[]"'):format(clearStashes)) - end - local count = 0 Wait(1000) @@ -272,7 +266,7 @@ local TriggerEventHooks = require 'modules.hooks.server' ---@param inv inventory ---@param item OxServerItem ----@param metadata table | string | nil +---@param metadata any ---@param count number ---@return table, number ---Generates metadata for new items being created through AddItem, buyItem, etc. @@ -291,13 +285,8 @@ function Items.Metadata(inv, item, metadata, count) if metadata.registered ~= false and (metadata.ammo or item.name == 'WEAPON_STUNGUN') then local registered = type(metadata.registered) == 'string' and metadata.registered or inv?.player?.name - - if registered then - metadata.registered = registered - metadata.serial = GenerateSerial(metadata.serial) - else - metadata.registered = nil - end + metadata.registered = registered + metadata.serial = GenerateSerial(metadata.serial) end if item.hash == `WEAPON_PETROLCAN` or item.hash == `WEAPON_HAZARDCAN` or item.hash == `WEAPON_FERTILIZERCAN` or item.hash == `WEAPON_FIREEXTINGUISHER` then @@ -372,7 +361,7 @@ function Items.CheckMetadata(metadata, item, name, ostime) local durability = metadata.durability if durability then - if durability > 100 and ostime >= durability then + if durability < 0 or durability > 100 and ostime >= durability then metadata.durability = 0 end else @@ -414,6 +403,41 @@ function Items.CheckMetadata(metadata, item, name, ostime) return metadata end +---Update item durability, and call `Inventory.RemoveItem` if it was removed from decay. +---@param inv OxInventory +---@param slot SlotWithItem +---@param item OxServerItem +---@param value? number +---@param ostime? number +---@return boolean? removed +function Items.UpdateDurability(inv, slot, item, value, ostime) + local durability = slot.metadata.durability or value + + if not durability then return end + + if value then + durability = value + elseif ostime and durability > 100 and ostime >= durability then + durability = 0 + end + + if item.decay and durability == 0 then + return Inventory.RemoveItem(inv, slot.name, slot.count, nil, slot.slot) + end + + if slot.metadata.durability == durability then return end + + inv.changed = true + slot.metadata.durability = durability + + inv:syncSlotsWithClients({ + { + item = slot, + inventory = inv.id + } + }, true) +end + local function Item(name, cb) local item = ItemList[name] diff --git a/server-data/resources/[ox]/ox_inventory/modules/items/shared.lua b/server-data/resources/[ox]/ox_inventory/modules/items/shared.lua index 35192fc22..cd40ff492 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/items/shared.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/items/shared.lua @@ -1,56 +1,3 @@ ----wip types - ----@class OxItem ----@field name string ----@field label string ----@field weight number Weight of the item in grams. ----@field description? string Text to display in the item tooltip. ----@field consume? number Number of items to remove on use.
Using a value under 1 will remove durability, if the item cannot be stacked. ----@field degrade? number Amount of time for the item durability to degrade to 0, in minutes. ----@field stack? boolean Set to false to prevent the item from stacking. ----@field close? boolean Set to false to keep the inventory open on item use. ----@field allowArmed? boolean Set to true to allow an item to be used while a weapon is equipped. ----@field buttons? { label: string, group: string, action: fun(slot: number) }[] Add interactions when right-clicking an item. ----@field [string] any - ----@class SlotWithItem ----@field name string ----@field label string ----@field weight number ----@field slot number ----@field count number ----@field metadata { [string]: any } ----@field description? string ----@field stack? boolean ----@field close? boolean - ----@class OxClientProps ----@field status? table ----@field anim? string | { dict?: string, clip: string, flag?: number, blendIn?: number, blendOut?: number, duration?: number, playbackRate?: number, lockX?: boolean, lockY?: boolean, lockZ?: boolean, scenario?: string, playEnter?: boolean } ----@field prop? string | ProgressPropProps ----@field usetime? number ----@field label? string ----@field useWhileDead? boolean ----@field canCancel? boolean ----@field disable? { move?: boolean, car?: boolean, combat?: boolean, mouse?: boolean } ----@field export string ----@field [string] any - ----@class OxClientItem : OxItem ----@field client? OxClientProps - ----@class OxServerItem : OxItem ----@field server? { export: string, [string]: any } - ----@class OxWeapon : OxItem ----@field hash number ----@field durability number ----@field weapon? true ----@field ammo? true ----@field component? true ----@field throwable? boolean ----@field model? string - local function useExport(resource, export) return function(...) return exports[resource][export](nil, ...) @@ -108,10 +55,11 @@ local function newItem(data) ItemList[data.name] = data end -for type, data in pairs(data('weapons')) do +for type, data in pairs(lib.load('data.weapons')) do for k, v in pairs(data) do v.name = k v.close = type == 'Ammo' and true or false + v.weight = v.weight or 0 if type == 'Weapons' then ---@cast v OxWeapon @@ -140,9 +88,13 @@ for type, data in pairs(data('weapons')) do end end -for k, v in pairs(data 'items') do +for k, v in pairs(lib.load('data.items')) do v.name = k - newItem(v) + local success, response = pcall(newItem, v) + + if not success then + warn(('An error occurred while creating item "%s" callback!\n^1SCRIPT ERROR: %s^0'):format(k, response)) + end end ItemList.cash = ItemList.money diff --git a/server-data/resources/[ox]/ox_inventory/modules/mysql/server.lua b/server-data/resources/[ox]/ox_inventory/modules/mysql/server.lua index 3eb91057b..5fb493f11 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/mysql/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/mysql/server.lua @@ -1,177 +1,250 @@ -if not lib then - return -end +if not lib then return end local Query = { - SELECT_STASH = "SELECT data FROM ox_inventory WHERE owner = ? AND name = ?", - UPDATE_STASH = "INSERT INTO ox_inventory (owner, name, data) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE data = VALUES(data)", - SELECT_GLOVEBOX = "SELECT plate, glovebox FROM `{vehicle_table}` WHERE `{vehicle_column}` = ?", - SELECT_TRUNK = "SELECT plate, trunk FROM `{vehicle_table}` WHERE `{vehicle_column}` = ?", - SELECT_PLAYER = "SELECT inventory FROM `{user_table}` WHERE `{user_column}` = ?", - UPDATE_TRUNK = "UPDATE `{vehicle_table}` SET trunk = ? WHERE `{vehicle_column}` = ?", - UPDATE_GLOVEBOX = "UPDATE `{vehicle_table}` SET glovebox = ? WHERE `{vehicle_column}` = ?", - UPDATE_PLAYER = "UPDATE `{user_table}` SET inventory = ? WHERE `{user_column}` = ?", + SELECT_STASH = 'SELECT data FROM ox_inventory WHERE owner = ? AND name = ?', + UPDATE_STASH = 'UPDATE ox_inventory SET data = ? WHERE owner = ? AND name = ?', + UPSERT_STASH = 'INSERT INTO ox_inventory (data, owner, name) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE data = VALUES(data)', + INSERT_STASH = 'INSERT INTO ox_inventory (owner, name) VALUES (?, ?)', + SELECT_GLOVEBOX = 'SELECT plate, glovebox FROM `{vehicle_table}` WHERE `{vehicle_column}` = ?', + SELECT_TRUNK = 'SELECT plate, trunk FROM `{vehicle_table}` WHERE `{vehicle_column}` = ?', + SELECT_PLAYER = 'SELECT inventory FROM `{user_table}` WHERE `{user_column}` = ?', + UPDATE_TRUNK = 'UPDATE `{vehicle_table}` SET trunk = ? WHERE `{vehicle_column}` = ?', + UPDATE_GLOVEBOX = 'UPDATE `{vehicle_table}` SET glovebox = ? WHERE `{vehicle_column}` = ?', + UPDATE_PLAYER = 'UPDATE `{user_table}` SET inventory = ? WHERE `{user_column}` = ?', } Citizen.CreateThreadNow(function() - local playerTable, playerColumn, vehicleTable, vehicleColumn - - if shared.framework == "ox" then - playerTable = "character_inventory" - playerColumn = "charid" - vehicleTable = "vehicles" - vehicleColumn = "id" - elseif shared.framework == "esx" then - playerTable = "users" - playerColumn = "identifier" - vehicleTable = "owned_vehicles" - vehicleColumn = "plate" - elseif shared.framework == "qb" then - playerTable = "players" - playerColumn = "citizenid" - vehicleTable = "player_vehicles" - vehicleColumn = "plate" - elseif shared.framework == "nd" then - playerTable = "characters" - playerColumn = "character_id" - vehicleTable = "vehicles" - vehicleColumn = "id" - end - - for k, v in pairs(Query) do - Query[k] = v:gsub("{user_table}", playerTable) - :gsub("{user_column}", playerColumn) - :gsub("{vehicle_table}", vehicleTable) - :gsub("{vehicle_column}", vehicleColumn) - end - - Wait(0) - - local success, result = pcall(MySQL.scalar.await, "SELECT 1 FROM ox_inventory") - - if not success then - MySQL.query([[CREATE TABLE `ox_inventory` ( + local playerTable, playerColumn, vehicleTable, vehicleColumn + + if shared.framework == 'ox' then + playerTable = 'character_inventory' + playerColumn = 'charid' + vehicleTable = 'vehicles' + vehicleColumn = 'id' + elseif shared.framework == 'esx' then + playerTable = 'users' + playerColumn = 'identifier' + vehicleTable = 'owned_vehicles' + vehicleColumn = 'plate' + elseif shared.framework == 'qb' then + playerTable = 'players' + playerColumn = 'citizenid' + vehicleTable = 'player_vehicles' + vehicleColumn = 'plate' + elseif shared.framework == 'nd' then + playerTable = 'nd_characters' + playerColumn = 'charid' + vehicleTable = 'nd_vehicles' + vehicleColumn = 'id' + end + + for k, v in pairs(Query) do + Query[k] = v:gsub('{user_table}', playerTable):gsub('{user_column}', playerColumn):gsub('{vehicle_table}', + vehicleTable):gsub('{vehicle_column}', vehicleColumn) + end + + Wait(0) + + local success, result = pcall(MySQL.scalar.await, 'SELECT 1 FROM ox_inventory') + + if not success then + MySQL.query([[CREATE TABLE `ox_inventory` ( `owner` varchar(60) DEFAULT NULL, `name` varchar(100) NOT NULL, `data` longtext DEFAULT NULL, `lastupdated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), UNIQUE KEY `owner` (`owner`,`name`) )]]) - else - -- Shouldn't be needed anymore; was used for some data conversion for v2.5.0 (back in March 2022) - -- result = MySQL.query.await("SELECT owner, name FROM ox_inventory WHERE NOT owner = ''") - - -- if result and next(result) then - -- local parameters = {} - -- local count = 0 - - -- for i = 1, #result do - -- local data = result[i] - -- local snip = data.name:sub(-#data.owner, #data.name) - - -- if data.owner == snip then - -- local name = data.name:sub(0, #data.name - #snip) - - -- count += 1 - -- parameters[count] = { query = 'UPDATE ox_inventory SET `name` = ? WHERE `owner` = ? AND `name` = ?', values = { name, data.owner, data.name } } - -- end - -- end - - -- if #parameters > 0 then - -- MySQL.transaction(parameters) - -- end - -- end - end + else + -- Shouldn't be needed anymore; was used for some data conversion for v2.5.0 (back in March 2022) + -- result = MySQL.query.await("SELECT owner, name FROM ox_inventory WHERE NOT owner = ''") - result = MySQL.query.await(("SHOW COLUMNS FROM `%s`"):format(vehicleTable)) + -- if result and next(result) then + -- local parameters = {} + -- local count = 0 - if result then - local glovebox, trunk + -- for i = 1, #result do + -- local data = result[i] + -- local snip = data.name:sub(-#data.owner, #data.name) - for i = 1, #result do - local column = result[i] - if column.Field == "glovebox" then - glovebox = true - elseif column.Field == "trunk" then - trunk = true - end - end + -- if data.owner == snip then + -- local name = data.name:sub(0, #data.name - #snip) - if not glovebox then - MySQL.query(("ALTER TABLE `%s` ADD COLUMN `glovebox` LONGTEXT NULL"):format(vehicleTable)) - end + -- count += 1 + -- parameters[count] = { query = 'UPDATE ox_inventory SET `name` = ? WHERE `owner` = ? AND `name` = ?', values = { name, data.owner, data.name } } + -- end + -- end - if not trunk then - MySQL.query(("ALTER TABLE `%s` ADD COLUMN `trunk` LONGTEXT NULL"):format(vehicleTable)) - end - end + -- if #parameters > 0 then + -- MySQL.transaction(parameters) + -- end + -- end + end + + result = MySQL.query.await(('SHOW COLUMNS FROM `%s`'):format(vehicleTable)) + + if result then + local glovebox, trunk + + for i = 1, #result do + local column = result[i] + if column.Field == 'glovebox' then + glovebox = true + elseif column.Field == 'trunk' then + trunk = true + end + end - success, result = pcall(MySQL.scalar.await, ("SELECT inventory FROM `%s`"):format(playerTable)) + if not glovebox then + MySQL.query(('ALTER TABLE `%s` ADD COLUMN `glovebox` LONGTEXT NULL'):format(vehicleTable)) + end - if not success then - return MySQL.query(("ALTER TABLE `%s` ADD COLUMN `inventory` LONGTEXT NULL"):format(playerTable)) + if not trunk then + MySQL.query(('ALTER TABLE `%s` ADD COLUMN `trunk` LONGTEXT NULL'):format(vehicleTable)) + end + end + + success, result = pcall(MySQL.scalar.await, ('SELECT inventory FROM `%s`'):format(playerTable)) + + if not success then + MySQL.query(('ALTER TABLE `%s` ADD COLUMN `inventory` LONGTEXT NULL'):format(playerTable)) + end + + local clearStashes = GetConvar('inventory:clearstashes', '6 MONTH') + + if clearStashes ~= '' then + pcall(MySQL.query.await, ('DELETE FROM ox_inventory WHERE lastupdated < (NOW() - INTERVAL %s)'):format(clearStashes)) end end) db = {} function db.loadPlayer(identifier) - local inventory = MySQL.prepare.await(Query.SELECT_PLAYER, { identifier }) --[[@as string?]] - return inventory and json.decode(inventory) + local inventory = MySQL.prepare.await(Query.SELECT_PLAYER, { identifier }) --[[@as string?]] + return inventory and json.decode(inventory) end function db.savePlayer(owner, inventory) - return MySQL.prepare(Query.UPDATE_PLAYER, { inventory, owner }) + return MySQL.prepare(Query.UPDATE_PLAYER, { inventory, owner }) end function db.saveStash(owner, dbId, inventory) - return MySQL.prepare(Query.UPDATE_STASH, { owner or "", dbId, inventory }) + return MySQL.prepare(Query.UPSERT_STASH, { inventory, owner and tostring(owner) or '', dbId }) end function db.loadStash(owner, name) - return MySQL.prepare.await(Query.SELECT_STASH, { owner or "", name }) + return MySQL.prepare.await(Query.SELECT_STASH, { owner and tostring(owner) or '', name }) end function db.saveGlovebox(id, inventory) - return MySQL.prepare(Query.UPDATE_GLOVEBOX, { inventory, id }) + return MySQL.prepare(Query.UPDATE_GLOVEBOX, { inventory, id }) end function db.loadGlovebox(id) - return MySQL.prepare.await(Query.SELECT_GLOVEBOX, { id }) + return MySQL.prepare.await(Query.SELECT_GLOVEBOX, { id }) end function db.saveTrunk(id, inventory) - return MySQL.prepare(Query.UPDATE_TRUNK, { inventory, id }) + return MySQL.prepare(Query.UPDATE_TRUNK, { inventory, id }) end function db.loadTrunk(id) - return MySQL.prepare.await(Query.SELECT_TRUNK, { id }) + return MySQL.prepare.await(Query.SELECT_TRUNK, { id }) end -function db.saveInventories(players, trunks, gloveboxes, stashes) - local numPlayer, numTrunk, numGlove, numStash = #players, #trunks, #gloveboxes, #stashes - - if numPlayer > 0 then - MySQL.prepare(Query.UPDATE_PLAYER, players) - end - - if numTrunk > 0 then - MySQL.prepare(Query.UPDATE_TRUNK, trunks) - end +---@param rows number | MySQLQuery | MySQLQuery[] +local function countRows(rows) + if type(rows) == 'number' then return rows end - if numGlove > 0 then - MySQL.prepare(Query.UPDATE_GLOVEBOX, gloveboxes) - end + local n = 0 - if numStash > 0 then - MySQL.prepare(Query.UPDATE_STASH, stashes) - end + for i = 1, #rows do + if rows[i] == 1 then n += 1 end + end - local total = numPlayer + numTrunk + numGlove + numStash + return n +end - if total > 0 then - shared.info(("Saving %s inventories to the database"):format(total)) - end +---@param players InventorySaveData[] +---@param trunks InventorySaveData[] +---@param gloveboxes InventorySaveData[] +---@param stashes (InventorySaveData | string | number)[] +---@param total number[] +function db.saveInventories(players, trunks, gloveboxes, stashes, total) + local promises = {} + local start = os.nanotime() + + shared.info(('Saving %s inventories to the database'):format(total[5])) + + if total[1] > 0 then + local p = promise.new() + promises[#promises + 1] = p + + MySQL.prepare(Query.UPDATE_PLAYER, players, function(resp) + shared.info(('Saved %d/%d players (%.4f ms)'):format(countRows(resp), total[1], (os.nanotime() - start) / 1e6)) + p:resolve() + end) + end + + if total[2] > 0 then + local p = promise.new() + promises[#promises + 1] = p + + MySQL.prepare(Query.UPDATE_TRUNK, trunks, function(resp) + shared.info(('Saved %d/%d trunks (%.4f ms)'):format(countRows(resp), total[2], (os.nanotime() - start) / 1e6)) + p:resolve() + end) + end + + if total[3] > 0 then + local p = promise.new() + promises[#promises + 1] = p + + MySQL.prepare(Query.UPDATE_GLOVEBOX, gloveboxes, function(resp) + shared.info(('Saved %d/%d gloveboxes (%.4f ms)'):format(countRows(resp), total[3], (os.nanotime() - start) / 1e6)) + p:resolve() + end) + end + + if total[4] > 0 then + local p = promise.new() + promises[#promises + 1] = p + + if server.bulkstashsave then + total[4] /= 3 + + MySQL.query(Query.UPSERT_STASH:gsub('%(%?, %?, %?%)', string.rep('(?, ?, ?)', total[4], ', ')), stashes, function(resp) + local affectedRows = resp.affectedRows + + if total[4] == 1 then + if affectedRows == 2 then affectedRows = 1 end + else + affectedRows -= tonumber(resp.info:match('Duplicates: (%d+)'), 10) or 0 + end + + shared.info(('Saved %d/%d stashes (%.4f ms)'):format(affectedRows, total[4], (os.nanotime() - start) / 1e6)) + p:resolve() + end) + else + MySQL.rawExecute(Query.UPSERT_STASH, stashes, function(resp) + local affectedRows = 0 + + if table.type(resp) == 'hash' then + if resp.affectedRows > 0 then affectedRows = 1 end + else + for i = 1, #resp do + if resp[i].affectedRows > 0 then affectedRows += 1 end + end + end + + shared.info(('Saved %s/%s stashes (%.4f ms)'):format(affectedRows, total[4], (os.nanotime() - start) / 1e6)) + p:resolve() + end) + end + end + + -- All queries must run asynchronously on resource stop, so we'll await multiple promises instead. + Citizen.Await(promise.all(promises)) end return db diff --git a/server-data/resources/[ox]/ox_inventory/modules/pefcl/server.lua b/server-data/resources/[ox]/ox_inventory/modules/pefcl/server.lua index 28c92984f..9414bf621 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/pefcl/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/pefcl/server.lua @@ -9,41 +9,41 @@ This is mostly here for ox_core. ]] -local Inventory = require("modules.inventory.server") +local Inventory = require 'modules.inventory.server' ---@param source number ---@param amount number -exports("addCash", function(source, amount) - Inventory.AddItem(source, "money", amount) +exports('addCash', function(source, amount) + Inventory.AddItem(source, 'money', amount) end) ---@param source number ---@param amount number -exports("removeCash", function(source, amount) - Inventory.RemoveItem(source, "money", amount) +exports('removeCash', function(source, amount) + Inventory.RemoveItem(source, 'money', amount) end) ---@param source number ---@return number? -exports("getCash", function(source) - return Inventory.GetItem(source, "money", false, true) or 0 --[[@as number]] +exports('getCash', function(source) + return Inventory.GetItem(source, 'money', false, true) or 0 --[[@as number]] end) ---@param source number ---@return table? -exports("getCards", function(source) - local items = Inventory(source).items +exports('getCards', function(source) + local items = Inventory(source)?.items if items then local retval, num = {}, 0 for _, data in pairs(items) do - if data.name == "mastercard" then + if data.name == 'mastercard' then num += 1 retval[num] = { id = data.metadata.id, holder = data.metadata.holder, - number = data.metadata.number, + number = data.metadata.number } end end @@ -54,14 +54,15 @@ end) ---@param source number ---@param card table -exports("giveCard", function(source, card) - Inventory.AddItem(source, "mastercard", 1, { +exports('giveCard', function(source, card) + Inventory.AddItem(source, 'mastercard', 1, { id = card.id, holder = card.holder, number = card.number, - description = ("Card Number: %s"):format(card.number), + description = ('Card Number: %s'):format(card.number) }) end) ---no-op -exports("getBank", function() end) +exports('getBank', function() end) + diff --git a/server-data/resources/[ox]/ox_inventory/modules/shops/client.lua b/server-data/resources/[ox]/ox_inventory/modules/shops/client.lua index e454e7e35..f5b3e780a 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/shops/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/shops/client.lua @@ -4,12 +4,13 @@ local shopTypes = {} local shops = {} local createBlip = require 'modules.utils.client'.CreateBlip -for shopType, shopData in pairs(data('shops') --[[@as table]]) do +for shopType, shopData in pairs(lib.load('data.shops') --[[@as table]]) do local shop = { name = shopData.name, groups = shopData.groups or shopData.jobs, blip = shopData.blip, label = shopData.label, + icon = shopData.icon } if shared.target then @@ -54,20 +55,17 @@ local function onEnterShop(point) SetEntityInvincible(entity, true) SetBlockingOfNonTemporaryEvents(entity, true) - exports.qtarget:AddTargetEntity(entity, { - options = { - { - icon = point.icon or 'fas fa-shopping-basket', - label = point.label, - job = point.groups, - action = function() - client.openInventory('shop', { id = point.invId, type = point.type }) - end, - iconColor = point.iconColor, - } - }, - - distance = point.shopDistance or 2.0 + exports.ox_target:addLocalEntity(entity, { + { + icon = point.icon or 'fas fa-shopping-basket', + label = point.label, + groups = point.groups, + onSelect = function() + client.openInventory('shop', { id = point.invId, type = point.type }) + end, + iconColor = point.iconColor, + distance = point.shopDistance or 2.0 + } }) point.entity = entity @@ -81,7 +79,7 @@ local function onExitShop(point) if not entity then return end - exports.qtarget:RemoveTargetEntity(entity, point.label) + exports.ox_target:removeLocalEntity(entity) Utils.DeleteEntity(entity) point.entity = nil @@ -96,7 +94,8 @@ local function wipeShops() local shop = shops[i] if shop.zoneId then - exports.qtarget:RemoveZone(shop.zoneId) + exports.ox_target:removeZone(shop.zoneId) + shop.zoneId = nil end if shop.remove then @@ -126,18 +125,17 @@ local function refreshShops() if shop.model then if not hasShopAccess(shop) then goto skipLoop end - exports.qtarget:RemoveTargetModel(shop.model, label) - exports.qtarget:AddTargetModel(shop.model, { - options = { - { - icon = shop.icon or 'fas fa-shopping-basket', - label = label, - action = function() - client.openInventory('shop', { type = type }) - end - }, - }, - distance = 2 + exports.ox_target:removeModel(shop.model, shop.name) + exports.ox_target:addModel(shop.model, { + { + name = shop.name, + icon = shop.icon or 'fas fa-shopping-basket', + label = label, + onSelect = function() + client.openInventory('shop', { type = type }) + end, + distance = 2 + }, }) elseif shop.targets then for i = 1, #shop.targets do @@ -165,37 +163,26 @@ local function refreshShops() onExit = onExitShop, shopDistance = target.distance, }) - elseif target.loc then + else if not hasShopAccess(shop) then goto nextShop end id += 1 shops[id] = { - zoneId = shopid, - blip = blip and createBlip(blip, target.loc) + zoneId = Utils.CreateBoxZone(target, { + { + name = shopid, + icon = 'fas fa-shopping-basket', + label = label, + groups = shop.groups, + onSelect = function() + client.openInventory('shop', { id = i, type = type }) + end, + iconColor = target.iconColor, + } + }), + blip = blip and createBlip(blip, target.coords) } - - exports.qtarget:AddBoxZone(shopid, target.loc, target.length or 0.5, target.width or 0.5, { - name = shopid, - heading = target.heading or 0.0, - debugPoly = target.debug, - minZ = target.minZ, - maxZ = target.maxZ, - drawSprite = target.drawSprite, - }, { - options = { - { - icon = 'fas fa-shopping-basket', - label = label, - job = shop.groups, - action = function() - client.openInventory('shop', { id = i, type = type }) - end, - iconColor = target.iconColor, - }, - }, - distance = target.distance or 2.0 - }) end ::nextShop:: diff --git a/server-data/resources/[ox]/ox_inventory/modules/shops/server.lua b/server-data/resources/[ox]/ox_inventory/modules/shops/server.lua index 3e4b4c14a..d5cb70693 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/shops/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/shops/server.lua @@ -6,25 +6,11 @@ local Shops = {} local locations = shared.target and 'targets' or 'locations' ---@class OxShopItem ----@field name string ---@field slot number ---@field weight number ----@field price number ----@field metadata? table ----@field license? string ----@field currency? string ----@field grade? number | number[] ----@field count? number - ----@class OxShopServer : OxShop ----@field id string ----@field coords vector3 ----@field items OxShopItem[] ----@field slots number ----@field [string] any local function setupShopItems(id, shopType, shopName, groups) - local shop = id and Shops[shopType][id] or Shops[shopType] --[[@as OxShopServer]] + local shop = id and Shops[shopType][id] or Shops[shopType] --[[@as OxShop]] for i = 1, shop.slots do local slot = shop.items[i] @@ -43,7 +29,7 @@ local function setupShopItems(id, shopType, shopName, groups) slot = i, weight = Item.weight, count = slot.count, - price = (server.randomprices and not slot.currency or slot.currency == 'money') and (math.ceil(slot.price * (math.random(80, 120)/100))) or slot.price or 0, + price = (server.randomprices and (not slot.currency or slot.currency == 'money')) and (math.ceil(slot.price * (math.random(80, 120)/100))) or slot.price or 0, metadata = slot.metadata, license = slot.license, currency = slot.currency, @@ -60,7 +46,7 @@ local function setupShopItems(id, shopType, shopName, groups) end ---@param shopType string ----@param properties OxShopServer +---@param properties OxShop local function registerShopType(shopType, properties) local shopLocations = properties[locations] or properties.locations @@ -87,12 +73,25 @@ local function createShop(shopType, id) if not shop then return end - local shopLocations = shop[locations] or shop.locations - local groups = shop.groups or shop.jobs + local store = (shop[locations] or shop.locations)?[id] - if not shopLocations or not shopLocations[id] then return end + if not store then return end - ---@type OxShopServer + local groups = shop.groups or shop.jobs + local coords + + if shared.target then + if store.length then + local z = store.loc.z + math.abs(store.minZ - store.maxZ) / 2 + coords = vec3(store.loc.x, store.loc.y, z) + else + coords = store.coords or store.loc + end + else + coords = store + end + + ---@type OxShop shop[id] = { label = shop.name, id = shopType..' '..id, @@ -100,7 +99,7 @@ local function createShop(shopType, id) items = table.clone(shop.inventory), slots = #shop.inventory, type = 'shop', - coords = shared.target and shop.targets?[id]?.loc or shopLocations[id], + coords = coords, distance = shared.target and shop.targets?[id]?.distance, } @@ -109,12 +108,12 @@ local function createShop(shopType, id) return shop[id] end -for shopType, shopDetails in pairs(data('shops')) do +for shopType, shopDetails in pairs(lib.load('data.shops')) do registerShopType(shopType, shopDetails) end ---@param shopType string ----@param shopDetails OxShopServer +---@param shopDetails OxShop exports('RegisterShop', function(shopType, shopDetails) registerShopType(shopType, shopDetails) end) @@ -135,7 +134,7 @@ lib.callback.register('ox_inventory:openShop', function(source, data) if not shop then return end end - ---@cast shop OxShopServer + ---@cast shop OxShop if shop.groups then local group = server.hasGroup(left, shop.groups) @@ -154,21 +153,12 @@ lib.callback.register('ox_inventory:openShop', function(source, data) return { label = left.label, type = left.type, slots = left.slots, weight = left.weight, maxWeight = left.maxWeight }, shop end) -local table = lib.table - --- http://lua-users.org/wiki/FormattingNumbers --- credit http://richard.warburton.it -local function comma_value(n) - local left, num, right = string.match(n,'^([^%d]*%d)(%d*)(.-)$') - return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right -end - local function canAffordItem(inv, currency, price) local canAfford = price >= 0 and Inventory.GetItem(inv, currency, false, true) >= price return canAfford or { type = 'error', - description = locale('cannot_afford', ('%s%s'):format((currency == 'money' and locale('$') or comma_value(price)), (currency == 'money' and comma_value(price) or ' '..Items(currency).label))) + description = locale('cannot_afford', ('%s%s'):format((currency == 'money' and locale('$') or math.groupdigits(price)), (currency == 'money' and math.groupdigits(price) or ' '..Items(currency).label))) } end @@ -277,7 +267,7 @@ lib.callback.register('ox_inventory:buyItem', function(source, data) if server.syncInventory then server.syncInventory(playerInv) end - local message = locale('purchased_for', count, fromItem.label, (currency == 'money' and locale('$') or comma_value(price)), (currency == 'money' and comma_value(price) or ' '..Items(currency).label)) + local message = locale('purchased_for', count, fromItem.label, (currency == 'money' and locale('$') or math.groupdigits(price)), (currency == 'money' and math.groupdigits(price) or ' '..Items(currency).label)) if server.loglevel > 0 then if server.loglevel > 1 or fromData.price >= 500 then diff --git a/server-data/resources/[ox]/ox_inventory/modules/utils/client.lua b/server-data/resources/[ox]/ox_inventory/modules/utils/client.lua index 3ab89e975..54c1ad5c2 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/utils/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/utils/client.lua @@ -1,6 +1,4 @@ -if not lib then - return -end +if not lib then return end local Utils = {} @@ -9,76 +7,34 @@ function Utils.PlayAnim(wait, dict, name, blendIn, blendOut, duration, flag, rat TaskPlayAnim(cache.ped, dict, name, blendIn, blendOut, duration, flag, rate, lockX, lockY, lockZ) RemoveAnimDict(dict) - if wait > 0 then - Wait(wait) - end + if wait > 0 then Wait(wait) end end -function Utils.PlayAnimAdvanced( - wait, - dict, - name, - posX, - posY, - posZ, - rotX, - rotY, - rotZ, - blendIn, - blendOut, - duration, - flag, - time -) +function Utils.PlayAnimAdvanced(wait, dict, name, posX, posY, posZ, rotX, rotY, rotZ, blendIn, blendOut, duration, flag, time) lib.requestAnimDict(dict) - TaskPlayAnimAdvanced( - cache.ped, - dict, - name, - posX, - posY, - posZ, - rotX, - rotY, - rotZ, - blendIn, - blendOut, - duration, - flag, - time, - 0, - 0 - ) + TaskPlayAnimAdvanced(cache.ped, dict, name, posX, posY, posZ, rotX, rotY, rotZ, blendIn, blendOut, duration, flag, time, 0, 0) RemoveAnimDict(dict) - if wait > 0 then - Wait(wait) - end + if wait > 0 then Wait(wait) end end -function Utils.Raycast(flag) +---@param flag number +---@param destination? vector3 +---@param size? number +---@return number | false +---@return number? +function Utils.Raycast(flag, destination, size) local playerCoords = GetEntityCoords(cache.ped) - local plyOffset = GetOffsetFromEntityInWorldCoords(cache.ped, 0.0, 2.2, -0.25) - local rayHandle = StartShapeTestCapsule( - playerCoords.x, - playerCoords.y, - playerCoords.z + 0.5, - plyOffset.x, - plyOffset.y, - plyOffset.z, - 2.2, - flag or 30, - cache.ped, - 4 - ) + destination = destination or GetOffsetFromEntityInWorldCoords(cache.ped, 0.0, 2.2, -0.25) + local rayHandle = StartShapeTestCapsule(playerCoords.x, playerCoords.y, playerCoords.z + 0.5, destination.x, destination.y, destination.z, size or 2.2, flag or 30, cache.ped, 4) while true do Wait(0) - local result, _, _, _, entityHit = GetShapeTestResult(rayHandle) + local result, _, coords, _, entityHit = GetShapeTestResult(rayHandle) if result ~= 1 then + -- DrawLine(playerCoords.x, playerCoords.y, playerCoords.z + 0.5, destination.x, destination.y, destination.z, 0, 0, 255, 255) + -- DrawLine(playerCoords.x, playerCoords.y, playerCoords.z + 0.5, coords.x, coords.y, coords.z, 255, 0, 0, 255) local entityType - if entityHit then - entityType = GetEntityType(entityHit) - end + if entityHit then entityType = GetEntityType(entityHit) end if entityHit and entityType ~= 0 then return entityHit, entityType end @@ -117,18 +73,18 @@ function Utils.Notify(data) lib.notify(data) end -RegisterNetEvent("ox_inventory:notify", Utils.Notify) -exports("notify", Utils.Notify) +RegisterNetEvent('ox_inventory:notify', Utils.Notify) +exports('notify', Utils.Notify) function Utils.ItemNotify(data) if not client.itemnotify then return end - SendNUIMessage({ action = "itemNotify", data = data }) + SendNUIMessage({action = 'itemNotify', data = data}) end -RegisterNetEvent("ox_inventory:itemNotify", Utils.ItemNotify) +RegisterNetEvent('ox_inventory:itemNotify', Utils.ItemNotify) ---@deprecated function Utils.DeleteObject(obj) @@ -148,9 +104,7 @@ local rewardTypes = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7 | 1 << 10 -- Enables the weapon wheel, but disables the use of inventory items -- Mostly used for weaponised vehicles, though could be called for "minigames" function Utils.WeaponWheel(state) - if state == nil then - state = EnableWeaponWheel - end + if state == nil then state = EnableWeaponWheel end EnableWeaponWheel = state SetWeaponsNoAutoswap(not state) @@ -162,7 +116,7 @@ function Utils.WeaponWheel(state) end end -exports("weaponWheel", Utils.WeaponWheel) +exports('weaponWheel', Utils.WeaponWheel) function Utils.CreateBlip(settings, coords) local blip = AddBlipForCoord(coords.x, coords.y, coords.z) @@ -177,4 +131,38 @@ function Utils.CreateBlip(settings, coords) return blip end +---Takes OxTargetBoxZone or legacy zone data (PolyZone) and creates a zone. +---@param data OxTargetBoxZone | { length: number, minZ: number, maxZ: number, loc: vector3, heading: number, width: number, distance: number } +---@param options? OxTargetOption[] +---@return number +function Utils.CreateBoxZone(data, options) + if data.length then + local height = math.abs(data.maxZ - data.minZ) + local z = data.loc.z + math.abs(data.minZ - data.maxZ) / 2 + data.coords = vec3(data.loc.x, data.loc.y, z) + data.size = vec3(data.width, data.length, height) + data.rotation = data.heading + data.loc = nil + data.heading = nil + data.length = nil + data.width = nil + data.maxZ = nil + data.minZ = nil + end + + if not data.options and options then + local distance = data.distance or 2.0 + + for k, v in pairs(options) do + if not v.distance then + v.distance = distance + end + end + + data.options = options + end + + return exports.ox_target:addBoxZone(data) +end + return Utils diff --git a/server-data/resources/[ox]/ox_inventory/modules/utils/server.lua b/server-data/resources/[ox]/ox_inventory/modules/utils/server.lua index f46c3ce7c..5bac990ff 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/utils/server.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/utils/server.lua @@ -1,26 +1,24 @@ -if not lib then - return -end +if not lib then return end local Utils = {} -local webHook = GetConvar("inventory:webhook", "") +local webHook = GetConvar('inventory:webhook', '') -if webHook ~= "" then +if webHook ~= '' then local validHosts = { - ["i.imgur.com"] = true, + ['i.imgur.com'] = true, } local validExtensions = { - ["png"] = true, - ["apng"] = true, - ["webp"] = true, + ['png'] = true, + ['apng'] = true, + ['webp'] = true, } - local headers = { ["Content-Type"] = "application/json" } + local headers = { ['Content-Type'] = 'application/json' } function Utils.IsValidImageUrl(url) - local host, extension = url:match("^https?://([^/]+).+%.([%l]+)") + local host, extension = url:match('^https?://([^/]+).+%.([%l]+)') return host and extension and validHosts[host] and validExtensions[extension] end @@ -28,29 +26,22 @@ if webHook ~= "" then ---@param message string ---@param image string function Utils.DiscordEmbed(title, message, image, color) - PerformHttpRequest( - webHook, - function() end, - "POST", - json.encode({ - username = "ox_inventory", - embeds = { - { - title = title, - color = color, - footer = { - text = os.date("%c"), - }, - description = message, - thumbnail = { - url = image, - width = 100, - }, + PerformHttpRequest(webHook, function() end, 'POST', json.encode({ + username = 'ox_inventory', embeds = { + { + title = title, + color = color, + footer = { + text = os.date('%c'), }, - }, - }), - headers - ) + description = message, + thumbnail = { + url = image, + width = 100, + } + } + } + }), headers) end end diff --git a/server-data/resources/[ox]/ox_inventory/modules/weapon/client.lua b/server-data/resources/[ox]/ox_inventory/modules/weapon/client.lua index e6c3f4103..d73ae9baa 100644 --- a/server-data/resources/[ox]/ox_inventory/modules/weapon/client.lua +++ b/server-data/resources/[ox]/ox_inventory/modules/weapon/client.lua @@ -1,16 +1,13 @@ -if not lib then - return -end +if not lib then return end local Weapon = {} -local Items = require("modules.items.client") -local Utils = require("modules.utils.client") +local Items = require 'modules.items.client' +local Utils = require 'modules.utils.client' -- generic group animation data local anims = {} -anims[`GROUP_MELEE`] = { "melee@holster", "unholster", 200, "melee@holster", "holster", 600 } -anims[`GROUP_PISTOL`] = - { "reaction@intimidation@cop@unarmed", "intro", 400, "reaction@intimidation@cop@unarmed", "outro", 450 } +anims[`GROUP_MELEE`] = { 'melee@holster', 'unholster', 200, 'melee@holster', 'holster', 600 } +anims[`GROUP_PISTOL`] = { 'reaction@intimidation@cop@unarmed', 'intro', 400, 'reaction@intimidation@cop@unarmed', 'outro', 450 } anims[`GROUP_STUNGUN`] = anims[`GROUP_PISTOL`] local function vehicleIsCycle(vehicle) @@ -21,6 +18,7 @@ end function Weapon.Equip(item, data) local playerPed = cache.ped local coords = GetEntityCoords(playerPed, true) + local sleep if client.weaponanims then if cache.vehicle and vehicleIsCycle(cache.vehicle) then @@ -33,24 +31,9 @@ function Weapon.Equip(item, data) anim = nil end - local sleep = anim and anim[3] or 1200 - - Utils.PlayAnimAdvanced( - sleep, - anim and anim[1] or "reaction@intimidation@1h", - anim and anim[2] or "intro", - coords.x, - coords.y, - coords.z, - 0, - 0, - GetEntityHeading(playerPed), - 8.0, - 3.0, - sleep * 2, - 50, - 0.1 - ) + sleep = anim and anim[3] or 1200 + + Utils.PlayAnimAdvanced(sleep, anim and anim[1] or 'reaction@intimidation@1h', anim and anim[2] or 'intro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(playerPed), 8.0, 3.0, sleep*2, 50, 0.1) end ::skipAnim:: @@ -64,14 +47,12 @@ function Weapon.Equip(item, data) GiveWeaponToPed(playerPed, data.hash, 0, false, true) - if item.metadata.tint then - SetPedWeaponTintIndex(playerPed, data.hash, item.metadata.tint) - end + if item.metadata.tint then SetPedWeaponTintIndex(playerPed, data.hash, item.metadata.tint) end if item.metadata.components then for i = 1, #item.metadata.components do local components = Items[item.metadata.components[i]].client.component - for v = 1, #components do + for v=1, #components do local component = components[v] if DoesWeaponTakeWeaponComponent(data.hash, component) then if not HasPedGotWeaponComponent(playerPed, data.hash, component) then @@ -83,8 +64,8 @@ function Weapon.Equip(item, data) end if item.metadata.specialAmmo then - local clipComponentKey = ("%s_CLIP"):format(data.model:gsub("WEAPON_", "COMPONENT_")) - local specialClip = ("%s_%s"):format(clipComponentKey, item.metadata.specialAmmo:upper()) + local clipComponentKey = ('%s_CLIP'):format(data.model:gsub('WEAPON_', 'COMPONENT_')) + local specialClip = ('%s_%s'):format(clipComponentKey, item.metadata.specialAmmo:upper()) if DoesWeaponTakeWeaponComponent(data.hash, specialClip) then GiveWeaponComponentToPed(playerPed, data.hash, specialClip) @@ -93,31 +74,29 @@ function Weapon.Equip(item, data) local ammo = item.metadata.ammo or item.throwable and 1 or 0 - SetPedAmmo(playerPed, data.hash, ammo) SetCurrentPedWeapon(playerPed, data.hash, true) SetPedCurrentWeaponVisible(playerPed, true, false, false, false) SetWeaponsNoAutoswap(true) - SetTimeout(0, function() - RefillAmmoInstantly(playerPed) - end) + SetPedAmmo(playerPed, data.hash, ammo) + SetTimeout(0, function() RefillAmmoInstantly(playerPed) end) if item.group == `GROUP_PETROLCAN` or item.group == `GROUP_FIREEXTINGUISHER` then item.metadata.ammo = item.metadata.durability SetPedInfiniteAmmo(playerPed, true, data.hash) end - TriggerEvent("ox_inventory:currentWeapon", item) - Utils.ItemNotify({ item, "ui_equipped" }) + TriggerEvent('ox_inventory:currentWeapon', item) + Utils.ItemNotify({ item, 'ui_equipped' }) - return item + return item, sleep end function Weapon.Disarm(currentWeapon, noAnim) - if currentWeapon.timer then + if currentWeapon?.timer then currentWeapon.timer = nil - if source == "" then - TriggerServerEvent("ox_inventory:updateWeapon") + if source == '' then + TriggerServerEvent('ox_inventory:updateWeapon') end SetPedAmmo(cache.ped, currentWeapon.hash, 0) @@ -139,28 +118,13 @@ function Weapon.Disarm(currentWeapon, noAnim) local sleep = anim and anim[6] or 1400 - Utils.PlayAnimAdvanced( - sleep, - anim and anim[4] or "reaction@intimidation@1h", - anim and anim[5] or "outro", - coords.x, - coords.y, - coords.z, - 0, - 0, - GetEntityHeading(cache.ped), - 8.0, - 3.0, - sleep, - 50, - 0 - ) + Utils.PlayAnimAdvanced(sleep, anim and anim[4] or 'reaction@intimidation@1h', anim and anim[5] or 'outro', coords.x, coords.y, coords.z, 0, 0, GetEntityHeading(cache.ped), 8.0, 3.0, sleep, 50, 0) end ::skipAnim:: - Utils.ItemNotify({ currentWeapon, "ui_holstered" }) - TriggerEvent("ox_inventory:currentWeapon") + Utils.ItemNotify({ currentWeapon, 'ui_holstered' }) + TriggerEvent('ox_inventory:currentWeapon') end Utils.WeaponWheel() diff --git a/server-data/resources/[ox]/ox_inventory/server.lua b/server-data/resources/[ox]/ox_inventory/server.lua index f4c517810..e19e6de02 100644 --- a/server-data/resources/[ox]/ox_inventory/server.lua +++ b/server-data/resources/[ox]/ox_inventory/server.lua @@ -12,6 +12,7 @@ local db = require 'modules.mysql.server' local Items = require 'modules.items.server' local Inventory = require 'modules.inventory.server' +require 'modules.crafting.server' require 'modules.shops.server' ---@param player table @@ -93,7 +94,7 @@ end ---@param source number ---@param invType string ----@param data string|number|table +---@param data? string|number|table ---@param ignoreSecurityChecks boolean? ---@return boolean|table|nil ---@return table? @@ -103,7 +104,12 @@ local function openInventory(source, invType, data, ignoreSecurityChecks) local left = Inventory(source) --[[@as OxInventory]] local right, closestCoords - Inventory.CloseAll(left, (invType == 'drop' or invType == 'container' or not invType) and source) + left:closeInventory(true) + Inventory.CloseAll(left, source) + + if invType == 'player' and data == source then + data = nil + end if data then if invType == 'stash' then @@ -135,7 +141,7 @@ local function openInventory(source, invType, data, ignoreSecurityChecks) end end elseif invType == 'container' then - left.containerSlot = data + left.containerSlot = data --[[@as number]] data = left.items[data] if data then @@ -161,6 +167,8 @@ local function openInventory(source, invType, data, ignoreSecurityChecks) if not TriggerEventHooks('openInventory', hookPayload) then return end + if left == right then return end + if right.player then if right.open then return end @@ -216,7 +224,7 @@ end) ---@param invType string ---@param data string|number|table exports('forceOpenInventory', function(playerId, invType, data) - local left, right = openInventory(playerId, invType, data) + local left, right = openInventory(playerId, invType, data, true) if left and right then TriggerClientEvent('ox_inventory:forceOpenInventory', playerId, left, right) @@ -224,7 +232,7 @@ exports('forceOpenInventory', function(playerId, invType, data) end end) -local Licenses = data 'licenses' +local Licenses = lib.load('data.licenses') lib.callback.register('ox_inventory:buyLicense', function(source, id) local license = Licenses[id] @@ -255,6 +263,25 @@ lib.callback.register('ox_inventory:getInventory', function(source, id) } end) +RegisterNetEvent('ox_inventory:usedItemInternal', function(slot) + local inventory = Inventory(source) + + if not inventory then return end + + local item = inventory.usingItem + + if not item or item.slot ~= slot then + ---@todo + DropPlayer(inventory.id, 'sussy') + + return + end + + TriggerEvent('ox_inventory:usedItem', inventory.id, item.name, item.slot, next(item.metadata) and item.metadata) + + inventory.usingItem = nil +end) + ---@param source number ---@param itemName string ---@param slot number? @@ -279,8 +306,7 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m local ostime = os.time() if ostime > durability then - inventory.items[slot].metadata.durability = 0 - + Items.UpdateDurability(inventory, data, item, 0) return TriggerClientEvent('ox_lib:notify', source, { type = 'error', description = locale('no_durability', label) }) elseif consume ~= 0 and consume < 1 then local degrade = (data.metadata.degrade or item.degrade) * 60 @@ -302,7 +328,7 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m end if item and data and data.count > 0 and data.name == item.name then - data = {name=data.name, label=label, count=data.count, slot=slot, metadata=data.metadata} + data = {name=data.name, label=label, count=data.count, slot=slot, metadata=data.metadata, weight=data.weight} if item.ammo then if inventory.weapon then @@ -328,6 +354,7 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m return TriggerClientEvent('ox_lib:notify', source, { type = 'error', description = locale('item_not_enough', item.name) }) end elseif not item.weapon and server.UseItem then + inventory.usingItem = data -- This is used to call an external useItem function, i.e. ESX.UseItem / QBCore.Functions.CanUseItem -- If an error is being thrown on item use there is no internal solution. We previously kept a list -- of usable items which led to issues when restarting resources (for obvious reasons), but config @@ -338,6 +365,7 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m data.consume = consume + ---@type boolean local success = lib.callback.await('ox_inventory:usingItem', source, data) if item.weapon then @@ -346,6 +374,8 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m if not success then return end + inventory.usingItem = data + if consume and consume ~= 0 and not data.component then data = inventory.items[data.slot] @@ -368,19 +398,13 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m local newItem = Inventory.SetSlot(inventory, item, 1, table.deepclone(data.metadata), emptySlot) if newItem then - newItem.metadata.durability = durability - - inventory:syncSlotsWithPlayer({ - { - item = newItem, - } - }, inventory.weight) + Items.UpdateDurability(inventory, newItem, item, durability) end end durability = 0 else - data.metadata.durability = durability + Items.UpdateDurability(inventory, data, item, durability) end if durability <= 0 then @@ -393,12 +417,6 @@ lib.callback.register('ox_inventory:useItem', function(source, itemName, slot, m else inventory.changed = true - inventory:syncSlotsWithPlayer({ - { - item = inventory.items[data.slot], - } - }, inventory.weight) - if server.syncInventory then server.syncInventory(inventory) end end @@ -535,7 +553,7 @@ lib.addCommand('clearevidence', { local hasPermission = group and server.isPlayerBoss(source, group, grade) if hasPermission then - MySQL.query('DELETE FROM ox_inventory WHERE name = ?', {('evidence-%s'):format(args.evidence)}) + MySQL.query('DELETE FROM ox_inventory WHERE name = ?', {('evidence-%s'):format(args.locker)}) end end) @@ -576,7 +594,7 @@ lib.addCommand('saveinv', { }, restricted = 'group.admin', }, function(source, args) - Inventory.SaveInventories(args.lock == 'true') + Inventory.SaveInventories(args.lock == 'true', false) end) lib.addCommand('viewinv', { @@ -586,12 +604,5 @@ lib.addCommand('viewinv', { }, restricted = 'group.admin', }, function(source, args) - local invId = tonumber(args.invId) or args.invId - local inventory = invId ~= source and Inventory(invId) - local playerInventory = Inventory(source) - - if playerInventory and inventory then - playerInventory:openInventory(inventory) - TriggerClientEvent('ox_inventory:viewInventory', source, inventory) - end + Inventory.InspectInventory(source, tonumber(args.invId) or args.invId) end) diff --git a/server-data/resources/[ox]/ox_inventory/setup/convert.lua b/server-data/resources/[ox]/ox_inventory/setup/convert.lua index 1e713aae7..7e327e3ee 100644 --- a/server-data/resources/[ox]/ox_inventory/setup/convert.lua +++ b/server-data/resources/[ox]/ox_inventory/setup/convert.lua @@ -171,7 +171,7 @@ local function ConvertQB() inventory[slot].metadata.durability = v.info.quality or 100 inventory[slot].metadata.ammo = v.info.ammo or 0 inventory[slot].metadata.components = {} - inventory[slot].metadata.serial = GenerateSerial() + inventory[slot].metadata.serial = v.info.serie or GenerateSerial() inventory[slot].metadata.quality = nil end end @@ -228,7 +228,7 @@ local function ConvertQB() inventory[slot].metadata.durability = v.info.quality or 100 inventory[slot].metadata.ammo = v.info.ammo or 0 inventory[slot].metadata.components = {} - inventory[slot].metadata.serial = GenerateSerial() + inventory[slot].metadata.serial = v.info.serie or GenerateSerial() inventory[slot].metadata.quality = nil end end @@ -280,7 +280,7 @@ local function ConvertQB() inventory[slot].metadata.durability = v.info.quality or 100 inventory[slot].metadata.ammo = v.info.ammo or 0 inventory[slot].metadata.components = {} - inventory[slot].metadata.serial = GenerateSerial() + inventory[slot].metadata.serial = v.info.serie or GenerateSerial() inventory[slot].metadata.quality = nil end end @@ -330,8 +330,7 @@ local function ConvertQB() for name, items in pairs(oxEvidence) do count += 1 parameters[count] = { "INSERT INTO ox_inventory (owner, name, data) VALUES ('', ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), data = VALUES(data)", { - name = name, - data = json.encode(items) + name, json.encode(items) }} end diff --git a/server-data/resources/[ox]/ox_inventory/web/build/LICENSE b/server-data/resources/[ox]/ox_inventory/web/build/LICENSE new file mode 100644 index 000000000..e6a7e76ca --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/web/build/LICENSE @@ -0,0 +1,18 @@ +Ox Inventory +Copyright © 2023 Overextended (https://github.com/overextended) +Linden (https://github.com/thelindat) +Luke (https://github.com/LukeWasTakenn) +Dunak (https://github.com/dunak-debug) + +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 . diff --git a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-95f8e076.css b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-95f8e076.css deleted file mode 100644 index 37e843457..000000000 --- a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-95f8e076.css +++ /dev/null @@ -1,427 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - height: 100vh; - background: none !important; - overflow: hidden !important; - user-select: none -} - -#root { - height: 100% -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, Courier New, monospace -} - -::-webkit-scrollbar { - display: none -} - -p { - margin: 0; - padding: 0; - font-family: Roboto -} - -input[type=number]::-webkit-inner-spin-button, -input[type=number]::-webkit-outer-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -.MuiMenuItem-root>div>p { - padding: 0 !important -} - -.MuiMenu-list { - min-width: 200px; - background-color: #22232c; - color: #c1c2c5; - padding: 4px; - border-color: #0003; - border-style: inset; - border-width: 1px; - font-size: 16px !important -} - -.MuiMenuItem-gutters { - padding: 4px 16px !important; - font-size: 16px !important -} - -.tooltip-description { - padding-top: 5px -} - -.tooltip-markdown>p { - margin: 0 -} - -button:active { - transform: translateY(3px) -} - -.item-drag-preview { - width: 7.7vh; - height: 7.7vh; - z-index: 1; - position: fixed; - pointer-events: none; - top: 0; - left: 0; - background-repeat: no-repeat; - background-position: center; - background-size: 7vh; - image-rendering: -webkit-optimize-contrast -} - -.inventory-wrapper { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - height: 100%; - gap: 20px -} - -.inventory-control { - display: flex -} - -.inventory-control .inventory-control-wrapper { - display: flex; - flex-direction: column; - gap: 20px; - justify-content: center; - align-items: center -} - -.inventory-control .inventory-control-input { - transition: .2s; - padding: 16px 8px; - border-radius: 2.5%; - font-family: Roboto; - font-size: 16px; - text-align: center; - outline: none; - border: none; - color: #fff; - background-color: #0c0c0c66 -} - -.inventory-control .inventory-control-input:focus-within { - background-color: #0c0c0ccc -} - -.inventory-control .inventory-control-button { - font-size: 14px; - color: #fff; - background-color: #0c0c0c66; - transition: .2s; - padding: 12px 8px; - border-radius: 2.5%; - border: none; - text-transform: uppercase; - font-family: Roboto; - width: 100%; - font-weight: 500 -} - -.inventory-control .inventory-control-button:hover { - background-color: #0c0c0ccc -} - -.useful-controls-dialog { - font-size: 18px -} - -.useful-controls-content-wrapper { - display: flex; - flex-direction: column; - gap: 20px -} - -.useful-controls-button { - position: absolute !important; - bottom: 25px; - right: 25px; - transition: .2s !important; - border-radius: 5% !important; - background-color: #0c0c0c66 !important -} - -.useful-controls-button:hover { - background-color: #0c0c0ccc !important -} - -.useful-controls-exit-button { - position: absolute !important; - right: 8px; - top: 8px; - border-radius: 2.5% !important; - color: gray !important -} - -.MuiDialogContent-root, -.MuiDialogTitle-root, -.MuiDialogActions-root { - background-color: #22232c; - color: #c1c2c5 -} - -.inventory-grid-wrapper { - display: flex; - flex-direction: column; - gap: 4px -} - -.inventory-grid-header-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between -} - -.inventory-grid-header-wrapper p { - font-size: 16px -} - -.inventory-grid-container { - display: grid; - height: calc(52.1vh + 10px); - grid-template-columns: repeat(5, 10.2vh); - grid-auto-rows: 10.42vh; - gap: 2px; - overflow-y: scroll -} - -.inventory-slot, -.item-notification-item-box, -.hotbar-item-slot { - background-color: #0c0c0c66; - background-repeat: no-repeat; - background-position: center; - border-radius: 2.5%; - image-rendering: -webkit-optimize-contrast; - position: relative; - background-size: 7vh; - color: #c1c2c5; - border-color: #0003; - border-style: inset; - border-width: 1px -} - -.inventory-slot-label-box { - background-color: #22232c; - color: #c1c2c5; - text-align: center; - border-bottom-left-radius: .25vh; - border-bottom-right-radius: .25vh; - border-top-color: #0003; - border-top-style: inset; - border-top-width: 1px -} - -.inventory-slot-label-text { - text-transform: uppercase; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding: 2px 3px; - font-weight: 400; - font-family: Roboto; - font-size: 12px -} - -.inventory-slot-number { - background-color: #fff; - color: #000; - height: 12px; - border-top-left-radius: .25vh; - border-bottom-right-radius: .25vh; - padding: 3px; - font-size: 12px; - font-family: Roboto -} - -.item-slot-wrapper { - display: flex; - flex-direction: column; - justify-content: space-between; - height: 100% -} - -.item-slot-wrapper p { - font-size: 12px -} - -.item-slot-header-wrapper, -.item-hotslot-header-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-end -} - -.item-hotslot-header-wrapper { - justify-content: space-between !important -} - -.item-slot-info-wrapper { - display: flex; - flex-direction: row; - align-self: flex-end; - padding: 3px; - gap: 3px -} - -.item-slot-info-wrapper p { - font-size: 12px -} - -.item-slot-currency-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - padding-right: 3px -} - -.item-slot-currency-wrapper p { - font-size: 14px; - text-shadow: .1vh .1vh 0 rgba(0, 0, 0, .7) -} - -.item-slot-price-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-right: 3px -} - -.item-slot-price-wrapper p { - font-size: 14px; - text-shadow: .1vh .1vh 0 rgba(0, 0, 0, .7) -} - -.MuiTooltip-tooltip { - background-color: #22232c !important; - min-width: 200px !important; - color: #c1c2c5 !important; - font-family: Roboto !important; - border-radius: 4px !important; - border-color: #0003 !important; - border-style: inset !important; - border-width: 1px !important -} - -.tooltip-wrapper { - display: flex; - flex-direction: column -} - -.tooltip-wrapper p { - font-size: 14px; - font-weight: 400 -} - -.tooltip-header-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center -} - -.tooltip-header-wrapper p { - font-size: 15px; - font-weight: 400 -} - -.tooltip-ingredients { - padding-top: 5px -} - -.tooltip-ingredient { - display: flex; - flex-direction: row; - align-items: center -} - -.tooltip-ingredient img { - width: 28px; - height: 28px; - padding-right: 5px -} - -.hotbar-container { - display: flex; - align-items: center; - gap: 2px; - justify-content: center; - width: 100%; - position: absolute; - bottom: 2vh -} - -.hotbar-item-slot { - width: 10.2vh; - height: 10.2vh -} - -.hotbar-slot-header-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between -} - -.item-notification-container { - display: flex; - overflow-x: scroll; - flex-wrap: nowrap; - gap: 2px; - position: absolute; - bottom: 20vh; - left: 50%; - width: 100%; - margin-left: calc(50% - 5.1vh); - transform: translate(-50%) -} - -.item-notification-action-box { - width: 100%; - color: #c1c2c5; - background-color: #0c0c0c66; - text-transform: uppercase; - text-align: center; - border-top-left-radius: .25vh; - border-top-right-radius: .25vh; - font-family: Roboto -} - -.item-notification-action-box p { - font-size: 11px; - padding: 2px; - font-weight: 600 -} - -.item-notification-item-box { - height: 10.2vh; - width: 10.2vh -} - -.durability-bar { - background: rgba(0, 0, 0, .5); - height: 3px; - overflow: hidden -} - -.weight-bar { - background: rgba(0, 0, 0, .4); - border: 1px inset rgba(0, 0, 0, .1); - height: .8vh; - border-radius: 5%; - overflow: hidden -} \ No newline at end of file diff --git a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9aba2ab3.css b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9aba2ab3.css new file mode 100644 index 000000000..de5dc4268 --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9aba2ab3.css @@ -0,0 +1 @@ +body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:100vh;background:none!important;overflow:hidden!important;user-select:none}#root{height:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}::-webkit-scrollbar{display:none}p{margin:0;padding:0;font-family:Roboto}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.app-wrapper{height:100%;width:100%;color:#fff}.context-menu-list{min-width:200px;background-color:#22232c;color:#c1c2c5;padding:4px;border-color:#0003;border-style:inset;border-width:1px;border-radius:4px;outline:none;display:flex;flex-direction:column}.context-menu-item{padding:8px;border-radius:4px;background-color:transparent;outline:none;border:none;color:#c1c2c5;display:flex;justify-content:space-between;align-items:center}.context-menu-item:active{transform:none}.context-menu-item:hover{background-color:#33343f;cursor:pointer}.tooltip-description{padding-top:5px}.tooltip-markdown>p{margin:0}button:active{transform:translateY(3px)}.item-drag-preview{width:7.7vh;height:7.7vh;z-index:1;position:fixed;pointer-events:none;top:0;left:0;background-repeat:no-repeat;background-position:center;background-size:7vh;image-rendering:-webkit-optimize-contrast}.inventory-wrapper{display:flex;flex-direction:row;justify-content:center;align-items:center;height:100%;gap:20px}.inventory-control{display:flex}.inventory-control .inventory-control-wrapper{display:flex;flex-direction:column;gap:20px;justify-content:center;align-items:center}.inventory-control .inventory-control-input{transition:.2s;padding:16px 8px;border-radius:2.5%;font-family:Roboto;font-size:16px;text-align:center;outline:none;border:none;color:#fff;background-color:#0c0c0c66}.inventory-control .inventory-control-input:focus-within{background-color:#0c0c0ccc}.inventory-control .inventory-control-button{font-size:14px;color:#fff;background-color:#0c0c0c66;transition:.2s;padding:12px 8px;border-radius:2.5%;border:none;text-transform:uppercase;font-family:Roboto;width:100%;font-weight:500}.inventory-control .inventory-control-button:hover{background-color:#0c0c0ccc}.useful-controls-dialog{background-color:#22232c;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#c1c2c5;width:450px;display:flex;flex-direction:column;padding:16px;border-radius:4px;gap:16px}.useful-controls-dialog-overlay{background-color:#00000080}.useful-controls-dialog-title{display:flex;width:100%;justify-content:space-between;align-items:center;font-size:18px}.useful-controls-dialog-close{width:25px;height:25px;padding:6px;display:flex;justify-content:center;align-items:center;border-radius:4px;fill:#c1c2c5}.useful-controls-dialog-close:hover{background-color:#33343f;cursor:pointer}.useful-controls-content-wrapper{display:flex;flex-direction:column;gap:20px}.divider{width:100%;height:1px;background-color:#ffffff1f}.useful-controls-button{position:absolute!important;bottom:25px;right:25px;transition:.2s!important;border:none;color:#fff;width:52px;height:52px;display:flex;justify-content:center;align-items:center;fill:#fff;border-radius:5%!important;background-color:#0c0c0c66!important}.useful-controls-button:hover{background-color:#0c0c0ccc!important;cursor:pointer}.useful-controls-exit-button{position:absolute!important;right:8px;top:8px;border-radius:2.5%!important;color:gray!important}.inventory-grid-wrapper{display:flex;flex-direction:column;gap:4px}.inventory-grid-header-wrapper{display:flex;flex-direction:row;justify-content:space-between}.inventory-grid-header-wrapper p{font-size:16px}.inventory-grid-container{display:grid;height:calc(52.1vh + 10px);grid-template-columns:repeat(5,10.2vh);grid-auto-rows:10.42vh;gap:2px;overflow-y:scroll}.inventory-slot,.item-notification-item-box,.hotbar-item-slot{background-color:#0c0c0c66;background-repeat:no-repeat;background-position:center;border-radius:2.5%;image-rendering:-webkit-optimize-contrast;position:relative;background-size:7vh;color:#c1c2c5;border-color:#0003;border-style:inset;border-width:1px}.inventory-slot-label-box{background-color:#22232c;color:#c1c2c5;text-align:center;border-bottom-left-radius:.25vh;border-bottom-right-radius:.25vh;border-top-color:#0003;border-top-style:inset;border-top-width:1px}.inventory-slot-label-text{text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:2px 3px;font-weight:400;font-family:Roboto;font-size:12px}.inventory-slot-number{background-color:#fff;color:#000;height:12px;border-top-left-radius:.25vh;border-bottom-right-radius:.25vh;padding:3px;font-size:12px;font-family:Roboto}.item-slot-wrapper{display:flex;flex-direction:column;justify-content:space-between;height:100%}.item-slot-wrapper p{font-size:12px}.item-slot-header-wrapper,.item-hotslot-header-wrapper{display:flex;flex-direction:row;justify-content:flex-end}.item-hotslot-header-wrapper{justify-content:space-between!important}.item-slot-info-wrapper{display:flex;flex-direction:row;align-self:flex-end;padding:3px;gap:3px}.item-slot-info-wrapper p{font-size:12px}.item-slot-currency-wrapper{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;padding-right:3px}.item-slot-currency-wrapper p{font-size:14px;text-shadow:.1vh .1vh 0 rgba(0,0,0,.7)}.item-slot-price-wrapper{display:flex;flex-direction:row;justify-content:flex-end;padding-right:3px}.item-slot-price-wrapper p{font-size:14px;text-shadow:.1vh .1vh 0 rgba(0,0,0,.7)}.tooltip-wrapper{pointer-events:none;display:flex;background-color:#22232c;width:200px;padding:8px;flex-direction:column;min-width:200px;color:#c1c2c5;font-family:Roboto;border-radius:4px;border-color:#0003;border-style:inset;border-width:1px}.tooltip-wrapper p{font-size:12px;font-weight:400}.tooltip-header-wrapper{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.tooltip-header-wrapper p{font-size:15px;font-weight:400}.tooltip-crafting-duration{display:flex;flex-direction:row;align-items:center;justify-content:center}.tooltip-crafting-duration svg{padding-right:3px}.tooltip-crafting-duration p{font-size:14px}.tooltip-ingredients{padding-top:5px}.tooltip-ingredient{display:flex;flex-direction:row;align-items:center}.tooltip-ingredient img{width:28px;height:28px;padding-right:5px}.hotbar-container{display:flex;align-items:center;gap:2px;justify-content:center;width:100%;position:absolute;bottom:2vh}.hotbar-item-slot{width:10.2vh;height:10.2vh}.hotbar-slot-header-wrapper{display:flex;flex-direction:row;justify-content:space-between}.item-notification-container{display:flex;overflow-x:scroll;flex-wrap:nowrap;gap:2px;position:absolute;bottom:20vh;left:50%;width:100%;margin-left:calc(50% - 5.1vh);transform:translate(-50%)}.item-notification-action-box{width:100%;color:#c1c2c5;background-color:#0c0c0c66;text-transform:uppercase;text-align:center;border-top-left-radius:.25vh;border-top-right-radius:.25vh;font-family:Roboto}.item-notification-action-box p{font-size:11px;padding:2px;font-weight:600}.item-notification-item-box{height:10.2vh;width:10.2vh}.durability-bar{background:rgba(0,0,0,.5);height:3px;overflow:hidden}.weight-bar{background:rgba(0,0,0,.4);border:1px inset rgba(0,0,0,.1);height:.8vh;border-radius:5%;overflow:hidden}.transition-fade-enter{opacity:0}.transition-fade-enter-active{opacity:1;transition:opacity .2s}.transition-fade-exit{opacity:1}.transition-fade-exit-active{opacity:0;transition:opacity .2s}.transition-slide-up-enter{transform:translateY(200px)}.transition-slide-up-enter-active{transform:translateY(0);transition:all .2s}.transition-slide-up-exit{transform:translateY(0)}.transition-slide-up-exit-active{transform:translateY(200px);transition:all .2s} diff --git a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9fceb909.js b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9fceb909.js deleted file mode 100644 index a3218f821..000000000 --- a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-9fceb909.js +++ /dev/null @@ -1,894 +0,0 @@ -function cL(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerpolicy&&(o.referrerPolicy=i.referrerpolicy),i.crossorigin==="use-credentials"?o.credentials="include":i.crossorigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();var ru=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function qy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function ih(e){var t=e.default;if(typeof t=="function"){var n=function r(){if(this instanceof r){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var oh={exports:{}},ah={},T={exports:{}},Ge={};var zc=Symbol.for("react.element"),fL=Symbol.for("react.portal"),dL=Symbol.for("react.fragment"),pL=Symbol.for("react.strict_mode"),hL=Symbol.for("react.profiler"),mL=Symbol.for("react.provider"),gL=Symbol.for("react.context"),vL=Symbol.for("react.forward_ref"),yL=Symbol.for("react.suspense"),xL=Symbol.for("react.memo"),bL=Symbol.for("react.lazy"),rk=Symbol.iterator;function wL(e){return e===null||typeof e!="object"?null:(e=rk&&e[rk]||e["@@iterator"],typeof e=="function"?e:null)}var gO={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},vO=Object.assign,yO={};function kl(e,t,n){this.props=e,this.context=t,this.refs=yO,this.updater=n||gO}kl.prototype.isReactComponent={};kl.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};kl.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function xO(){}xO.prototype=kl.prototype;function Yy(e,t,n){this.props=e,this.context=t,this.refs=yO,this.updater=n||gO}var Ky=Yy.prototype=new xO;Ky.constructor=Yy;vO(Ky,kl.prototype);Ky.isPureReactComponent=!0;var ik=Array.isArray,bO=Object.prototype.hasOwnProperty,Xy={current:null},wO={key:!0,ref:!0,__self:!0,__source:!0};function SO(e,t,n){var r,i={},o=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(o=""+t.key),t)bO.call(t,r)&&!wO.hasOwnProperty(r)&&(i[r]=t[r]);var u=arguments.length-2;if(u===1)i.children=n;else if(1>>1,M=H[A];if(0>>1;Ai(Se,K))mei(Ae,Se)?(H[A]=Ae,H[me]=K,A=me):(H[A]=Se,H[xe]=K,A=xe);else if(mei(Ae,K))H[A]=Ae,H[me]=K,A=me;else break e}}return Q}function i(H,Q){var K=H.sortIndex-Q.sortIndex;return K!==0?K:H.id-Q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var s=Date,u=s.now();e.unstable_now=function(){return s.now()-u}}var c=[],f=[],p=1,h=null,g=3,v=!1,y=!1,b=!1,C=typeof setTimeout=="function"?setTimeout:null,x=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S(H){for(var Q=n(f);Q!==null;){if(Q.callback===null)r(f);else if(Q.startTime<=H)r(f),Q.sortIndex=Q.expirationTime,t(c,Q);else break;Q=n(f)}}function E(H){if(b=!1,S(H),!y)if(n(c)!==null)y=!0,oe(I);else{var Q=n(f);Q!==null&&le(E,Q.startTime-H)}}function I(H,Q){y=!1,b&&(b=!1,x(D),D=-1),v=!0;var K=g;try{for(S(Q),h=n(c);h!==null&&(!(h.expirationTime>Q)||H&&!B());){var A=h.callback;if(typeof A=="function"){h.callback=null,g=h.priorityLevel;var M=A(h.expirationTime<=Q);Q=e.unstable_now(),typeof M=="function"?h.callback=M:h===n(c)&&r(c),S(Q)}else r(c);h=n(c)}if(h!==null)var we=!0;else{var xe=n(f);xe!==null&&le(E,xe.startTime-Q),we=!1}return we}finally{h=null,g=K,v=!1}}var _=!1,R=null,D=-1,W=5,L=-1;function B(){return!(e.unstable_now()-LH||125A?(H.sortIndex=K,t(f,H),n(c)===null&&H===n(f)&&(b?(x(D),D=-1):b=!0,le(E,K-A))):(H.sortIndex=M,t(c,H),y||v||(y=!0,oe(I))),H},e.unstable_shouldYield=B,e.unstable_wrapCallback=function(H){var Q=g;return function(){var K=g;g=Q;try{return H.apply(this,arguments)}finally{g=K}}}})(EO);(function(e){e.exports=EO})(CO);var OO=T.exports,br=CO.exports;function ie(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),e0=Object.prototype.hasOwnProperty,AL=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ak={},sk={};function ML(e){return e0.call(sk,e)?!0:e0.call(ak,e)?!1:AL.test(e)?sk[e]=!0:(ak[e]=!0,!1)}function $L(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function DL(e,t,n,r){if(t===null||typeof t>"u"||$L(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function jn(e,t,n,r,i,o,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=s}var wn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){wn[e]=new jn(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];wn[t]=new jn(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){wn[e]=new jn(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){wn[e]=new jn(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){wn[e]=new jn(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){wn[e]=new jn(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){wn[e]=new jn(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){wn[e]=new jn(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){wn[e]=new jn(e,5,!1,e.toLowerCase(),null,!1,!1)});var Zy=/[\-:]([a-z])/g;function Jy(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Zy,Jy);wn[t]=new jn(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Zy,Jy);wn[t]=new jn(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Zy,Jy);wn[t]=new jn(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){wn[e]=new jn(e,1,!1,e.toLowerCase(),null,!1,!1)});wn.xlinkHref=new jn("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){wn[e]=new jn(e,1,!1,e.toLowerCase(),null,!0,!0)});function e1(e,t,n,r){var i=wn.hasOwnProperty(t)?wn[t]:null;(i!==null?i.type!==0:r||!(2u||i[s]!==o[u]){var c=` -`+i[s].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}while(1<=s&&0<=u);break}}}finally{Hg=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Au(e):""}function NL(e){switch(e.tag){case 5:return Au(e.type);case 16:return Au("Lazy");case 13:return Au("Suspense");case 19:return Au("SuspenseList");case 0:case 2:case 15:return e=Vg(e.type,!1),e;case 11:return e=Vg(e.type.render,!1),e;case 1:return e=Vg(e.type,!0),e;default:return""}}function i0(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Is:return"Fragment";case Ts:return"Portal";case t0:return"Profiler";case t1:return"StrictMode";case n0:return"Suspense";case r0:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case TO:return(e.displayName||"Context")+".Consumer";case PO:return(e._context.displayName||"Context")+".Provider";case n1:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case r1:return t=e.displayName||null,t!==null?t:i0(e.type)||"Memo";case _o:t=e._payload,e=e._init;try{return i0(e(t))}catch{}}return null}function LL(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return i0(t);case 8:return t===t1?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function qo(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function RO(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function FL(e){var t=RO(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(s){r=""+s,o.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ad(e){e._valueTracker||(e._valueTracker=FL(e))}function AO(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=RO(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function pp(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function o0(e,t){var n=t.checked;return zt({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function uk(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=qo(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function MO(e,t){t=t.checked,t!=null&&e1(e,"checked",t,!1)}function a0(e,t){MO(e,t);var n=qo(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?s0(e,t.type,n):t.hasOwnProperty("defaultValue")&&s0(e,t.type,qo(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ck(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function s0(e,t,n){(t!=="number"||pp(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Mu=Array.isArray;function Vs(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=sd.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function lc(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var ju={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},zL=["Webkit","ms","Moz","O"];Object.keys(ju).forEach(function(e){zL.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ju[t]=ju[e]})});function LO(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||ju.hasOwnProperty(e)&&ju[e]?(""+t).trim():t+"px"}function FO(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,i=LO(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}var BL=zt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function c0(e,t){if(t){if(BL[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(ie(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(ie(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(ie(61))}if(t.style!=null&&typeof t.style!="object")throw Error(ie(62))}}function f0(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var d0=null;function i1(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var p0=null,Gs=null,qs=null;function pk(e){if(e=Wc(e)){if(typeof p0!="function")throw Error(ie(280));var t=e.stateNode;t&&(t=fh(t),p0(e.stateNode,e.type,t))}}function zO(e){Gs?qs?qs.push(e):qs=[e]:Gs=e}function BO(){if(Gs){var e=Gs,t=qs;if(qs=Gs=null,pk(e),t)for(e=0;e>>=0,e===0?32:31-(QL(e)/ZL|0)|0}var ld=64,ud=4194304;function $u(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function vp(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,o=e.pingedLanes,s=n&268435455;if(s!==0){var u=s&~i;u!==0?r=$u(u):(o&=s,o!==0&&(r=$u(o)))}else s=n&~i,s!==0?r=$u(s):o!==0&&(r=$u(o));if(r===0)return 0;if(t!==0&&t!==r&&(t&i)===0&&(i=r&-r,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Bc(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-fi(t),e[t]=n}function n6(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Uu),Sk=String.fromCharCode(32),kk=!1;function a_(e,t){switch(e){case"keyup":return I6.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function s_(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Rs=!1;function A6(e,t){switch(e){case"compositionend":return s_(t);case"keypress":return t.which!==32?null:(kk=!0,Sk);case"textInput":return e=t.data,e===Sk&&kk?null:e;default:return null}}function M6(e,t){if(Rs)return e==="compositionend"||!d1&&a_(e,t)?(e=i_(),Vd=u1=Ao=null,Rs=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=_k(n)}}function f_(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?f_(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function d_(){for(var e=window,t=pp();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=pp(e.document)}return t}function p1(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function W6(e){var t=d_(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&f_(n.ownerDocument.documentElement,n)){if(r!==null&&p1(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,o=Math.min(r.start,i);r=r.end===void 0?o:Math.min(r.end,i),!e.extend&&o>r&&(i=r,r=o,o=i),i=Pk(n,o);var s=Pk(n,r);i&&s&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,As=null,x0=null,Vu=null,b0=!1;function Tk(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;b0||As==null||As!==pp(r)||(r=As,"selectionStart"in r&&p1(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Vu&&hc(Vu,r)||(Vu=r,r=bp(x0,"onSelect"),0Ds||(e.current=O0[Ds],O0[Ds]=null,Ds--)}function bt(e,t){Ds++,O0[Ds]=e.current,e.current=t}var Yo={},An=ia(Yo),Xn=ia(!1),Ba=Yo;function al(e,t){var n=e.type.contextTypes;if(!n)return Yo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in n)i[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Qn(e){return e=e.childContextTypes,e!=null}function Sp(){Tt(Xn),Tt(An)}function Nk(e,t,n){if(An.current!==Yo)throw Error(ie(168));bt(An,t),bt(Xn,n)}function w_(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var i in r)if(!(i in t))throw Error(ie(108,LL(e)||"Unknown",i));return zt({},n,r)}function kp(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Yo,Ba=An.current,bt(An,e),bt(Xn,Xn.current),!0}function Lk(e,t,n){var r=e.stateNode;if(!r)throw Error(ie(169));n?(e=w_(e,t,Ba),r.__reactInternalMemoizedMergedChildContext=e,Tt(Xn),Tt(An),bt(An,e)):Tt(Xn),bt(Xn,n)}var qi=null,dh=!1,ov=!1;function S_(e){qi===null?qi=[e]:qi.push(e)}function eF(e){dh=!0,S_(e)}function oa(){if(!ov&&qi!==null){ov=!0;var e=0,t=st;try{var n=qi;for(st=1;e>=s,i-=s,Yi=1<<32-fi(t)+i|n<D?(W=R,R=null):W=R.sibling;var L=g(x,R,S[D],E);if(L===null){R===null&&(R=W);break}e&&R&&L.alternate===null&&t(x,R),w=o(L,w,D),_===null?I=L:_.sibling=L,_=L,R=W}if(D===S.length)return n(x,R),$t&&Ca(x,D),I;if(R===null){for(;DD?(W=R,R=null):W=R.sibling;var B=g(x,R,L.value,E);if(B===null){R===null&&(R=W);break}e&&R&&B.alternate===null&&t(x,R),w=o(B,w,D),_===null?I=B:_.sibling=B,_=B,R=W}if(L.done)return n(x,R),$t&&Ca(x,D),I;if(R===null){for(;!L.done;D++,L=S.next())L=h(x,L.value,E),L!==null&&(w=o(L,w,D),_===null?I=L:_.sibling=L,_=L);return $t&&Ca(x,D),I}for(R=r(x,R);!L.done;D++,L=S.next())L=v(R,x,D,L.value,E),L!==null&&(e&&L.alternate!==null&&R.delete(L.key===null?D:L.key),w=o(L,w,D),_===null?I=L:_.sibling=L,_=L);return e&&R.forEach(function(Y){return t(x,Y)}),$t&&Ca(x,D),I}function C(x,w,S,E){if(typeof S=="object"&&S!==null&&S.type===Is&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case od:e:{for(var I=S.key,_=w;_!==null;){if(_.key===I){if(I=S.type,I===Is){if(_.tag===7){n(x,_.sibling),w=i(_,S.props.children),w.return=x,x=w;break e}}else if(_.elementType===I||typeof I=="object"&&I!==null&&I.$$typeof===_o&&Hk(I)===_.type){n(x,_.sibling),w=i(_,S.props),w.ref=uu(x,_,S),w.return=x,x=w;break e}n(x,_);break}else t(x,_);_=_.sibling}S.type===Is?(w=La(S.props.children,x.mode,E,S.key),w.return=x,x=w):(E=Jd(S.type,S.key,S.props,null,x.mode,E),E.ref=uu(x,w,S),E.return=x,x=E)}return s(x);case Ts:e:{for(_=S.key;w!==null;){if(w.key===_)if(w.tag===4&&w.stateNode.containerInfo===S.containerInfo&&w.stateNode.implementation===S.implementation){n(x,w.sibling),w=i(w,S.children||[]),w.return=x,x=w;break e}else{n(x,w);break}else t(x,w);w=w.sibling}w=pv(S,x.mode,E),w.return=x,x=w}return s(x);case _o:return _=S._init,C(x,w,_(S._payload),E)}if(Mu(S))return y(x,w,S,E);if(iu(S))return b(x,w,S,E);gd(x,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,w!==null&&w.tag===6?(n(x,w.sibling),w=i(w,S),w.return=x,x=w):(n(x,w),w=dv(S,x.mode,E),w.return=x,x=w),s(x)):n(x,w)}return C}var ll=I_(!0),R_=I_(!1),Uc={},Pi=ia(Uc),yc=ia(Uc),xc=ia(Uc);function Aa(e){if(e===Uc)throw Error(ie(174));return e}function S1(e,t){switch(bt(xc,t),bt(yc,e),bt(Pi,Uc),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:u0(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=u0(t,e)}Tt(Pi),bt(Pi,t)}function ul(){Tt(Pi),Tt(yc),Tt(xc)}function A_(e){Aa(xc.current);var t=Aa(Pi.current),n=u0(t,e.type);t!==n&&(bt(yc,e),bt(Pi,n))}function k1(e){yc.current===e&&(Tt(Pi),Tt(yc))}var Lt=ia(0);function Tp(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var av=[];function C1(){for(var e=0;en?n:4,e(!0);var r=sv.transition;sv.transition={};try{e(!1),t()}finally{st=n,sv.transition=r}}function Y_(){return qr().memoizedState}function iF(e,t,n){var r=Wo(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},K_(e))X_(t,n);else if(n=O_(e,t,n,r),n!==null){var i=zn();di(n,e,r,i),Q_(n,t,r)}}function oF(e,t,n){var r=Wo(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(K_(e))X_(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var s=t.lastRenderedState,u=o(s,n);if(i.hasEagerState=!0,i.eagerState=u,pi(u,s)){var c=t.interleaved;c===null?(i.next=i,b1(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}finally{}n=O_(e,t,i,r),n!==null&&(i=zn(),di(n,e,r,i),Q_(n,t,r))}}function K_(e){var t=e.alternate;return e===Ft||t!==null&&t===Ft}function X_(e,t){Gu=Ip=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Q_(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,a1(e,n)}}var Rp={readContext:Gr,useCallback:On,useContext:On,useEffect:On,useImperativeHandle:On,useInsertionEffect:On,useLayoutEffect:On,useMemo:On,useReducer:On,useRef:On,useState:On,useDebugValue:On,useDeferredValue:On,useTransition:On,useMutableSource:On,useSyncExternalStore:On,useId:On,unstable_isNewReconciler:!1},aF={readContext:Gr,useCallback:function(e,t){return xi().memoizedState=[e,t===void 0?null:t],e},useContext:Gr,useEffect:Gk,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Kd(4194308,4,U_.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Kd(4194308,4,e,t)},useInsertionEffect:function(e,t){return Kd(4,2,e,t)},useMemo:function(e,t){var n=xi();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=xi();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=iF.bind(null,Ft,e),[r.memoizedState,e]},useRef:function(e){var t=xi();return e={current:e},t.memoizedState=e},useState:Vk,useDebugValue:T1,useDeferredValue:function(e){return xi().memoizedState=e},useTransition:function(){var e=Vk(!1),t=e[0];return e=rF.bind(null,e[1]),xi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Ft,i=xi();if($t){if(n===void 0)throw Error(ie(407));n=n()}else{if(n=t(),dn===null)throw Error(ie(349));(Wa&30)!==0||D_(r,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,Gk(L_.bind(null,r,o,e),[e]),r.flags|=2048,Sc(9,N_.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=xi(),t=dn.identifierPrefix;if($t){var n=Ki,r=Yi;n=(r&~(1<<32-fi(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=bc++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[ki]=t,e[vc]=r,aP(e,t,!1,!1),t.stateNode=e;e:{switch(s=f0(n,r),n){case"dialog":Et("cancel",e),Et("close",e),i=r;break;case"iframe":case"object":case"embed":Et("load",e),i=r;break;case"video":case"audio":for(i=0;ifl&&(t.flags|=128,r=!0,cu(o,!1),t.lanes=4194304)}else{if(!r)if(e=Tp(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),cu(o,!0),o.tail===null&&o.tailMode==="hidden"&&!s.alternate&&!$t)return _n(t),null}else 2*Gt()-o.renderingStartTime>fl&&n!==1073741824&&(t.flags|=128,r=!0,cu(o,!1),t.lanes=4194304);o.isBackwards?(s.sibling=t.child,t.child=s):(n=o.last,n!==null?n.sibling=s:t.child=s,o.last=s)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Gt(),t.sibling=null,n=Lt.current,bt(Lt,r?n&1|2:n&1),t):(_n(t),null);case 22:case 23:return D1(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(pr&1073741824)!==0&&(_n(t),t.subtreeFlags&6&&(t.flags|=8192)):_n(t),null;case 24:return null;case 25:return null}throw Error(ie(156,t.tag))}function hF(e,t){switch(m1(t),t.tag){case 1:return Qn(t.type)&&Sp(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ul(),Tt(Xn),Tt(An),C1(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return k1(t),null;case 13:if(Tt(Lt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(ie(340));sl()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Tt(Lt),null;case 4:return ul(),null;case 10:return x1(t.type._context),null;case 22:case 23:return D1(),null;case 24:return null;default:return null}}var yd=!1,In=!1,mF=typeof WeakSet=="function"?WeakSet:Set,pe=null;function zs(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Wt(e,t,r)}else n.current=null}function F0(e,t,n){try{n()}catch(r){Wt(e,t,r)}}var t2=!1;function gF(e,t){if(w0=yp,e=d_(),p1(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var s=0,u=-1,c=-1,f=0,p=0,h=e,g=null;t:for(;;){for(var v;h!==n||i!==0&&h.nodeType!==3||(u=s+i),h!==o||r!==0&&h.nodeType!==3||(c=s+r),h.nodeType===3&&(s+=h.nodeValue.length),(v=h.firstChild)!==null;)g=h,h=v;for(;;){if(h===e)break t;if(g===n&&++f===i&&(u=s),g===o&&++p===r&&(c=s),(v=h.nextSibling)!==null)break;h=g,g=h.parentNode}h=v}n=u===-1||c===-1?null:{start:u,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(S0={focusedElem:e,selectionRange:n},yp=!1,pe=t;pe!==null;)if(t=pe,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,pe=e;else for(;pe!==null;){t=pe;try{var y=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var b=y.memoizedProps,C=y.memoizedState,x=t.stateNode,w=x.getSnapshotBeforeUpdate(t.elementType===t.type?b:oi(t.type,b),C);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(ie(163))}}catch(E){Wt(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,pe=e;break}pe=t.return}return y=t2,t2=!1,y}function qu(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&F0(t,n,o)}i=i.next}while(i!==r)}}function mh(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function z0(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function uP(e){var t=e.alternate;t!==null&&(e.alternate=null,uP(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[ki],delete t[vc],delete t[E0],delete t[Z6],delete t[J6])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function cP(e){return e.tag===5||e.tag===3||e.tag===4}function n2(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||cP(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function B0(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=wp));else if(r!==4&&(e=e.child,e!==null))for(B0(e,t,n),e=e.sibling;e!==null;)B0(e,t,n),e=e.sibling}function j0(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(j0(e,t,n),e=e.sibling;e!==null;)j0(e,t,n),e=e.sibling}var gn=null,ai=!1;function So(e,t,n){for(n=n.child;n!==null;)fP(e,t,n),n=n.sibling}function fP(e,t,n){if(_i&&typeof _i.onCommitFiberUnmount=="function")try{_i.onCommitFiberUnmount(sh,n)}catch{}switch(n.tag){case 5:In||zs(n,t);case 6:var r=gn,i=ai;gn=null,So(e,t,n),gn=r,ai=i,gn!==null&&(ai?(e=gn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):gn.removeChild(n.stateNode));break;case 18:gn!==null&&(ai?(e=gn,n=n.stateNode,e.nodeType===8?iv(e.parentNode,n):e.nodeType===1&&iv(e,n),dc(e)):iv(gn,n.stateNode));break;case 4:r=gn,i=ai,gn=n.stateNode.containerInfo,ai=!0,So(e,t,n),gn=r,ai=i;break;case 0:case 11:case 14:case 15:if(!In&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var o=i,s=o.destroy;o=o.tag,s!==void 0&&((o&2)!==0||(o&4)!==0)&&F0(n,t,s),i=i.next}while(i!==r)}So(e,t,n);break;case 1:if(!In&&(zs(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){Wt(n,t,u)}So(e,t,n);break;case 21:So(e,t,n);break;case 22:n.mode&1?(In=(r=In)||n.memoizedState!==null,So(e,t,n),In=r):So(e,t,n);break;default:So(e,t,n)}}function r2(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new mF),t.forEach(function(r){var i=EF.bind(null,e,r);n.has(r)||(n.add(r),r.then(i,i))})}}function ii(e,t){var n=t.deletions;if(n!==null)for(var r=0;ri&&(i=s),r&=~o}if(r=i,r=Gt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*yF(r/1960))-r,10e?16:e,Mo===null)var r=!1;else{if(e=Mo,Mo=null,$p=0,(Xe&6)!==0)throw Error(ie(331));var i=Xe;for(Xe|=4,pe=e.current;pe!==null;){var o=pe,s=o.child;if((pe.flags&16)!==0){var u=o.deletions;if(u!==null){for(var c=0;cGt()-M1?Na(e,0):A1|=n),Zn(e,t)}function xP(e,t){t===0&&((e.mode&1)===0?t=1:(t=ud,ud<<=1,(ud&130023424)===0&&(ud=4194304)));var n=zn();e=eo(e,t),e!==null&&(Bc(e,t,n),Zn(e,n))}function CF(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),xP(e,n)}function EF(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(ie(314))}r!==null&&r.delete(t),xP(e,n)}var bP;bP=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Xn.current)Kn=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return Kn=!1,dF(e,t,n);Kn=(e.flags&131072)!==0}else Kn=!1,$t&&(t.flags&1048576)!==0&&k_(t,Ep,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Xd(e,t),e=t.pendingProps;var i=al(t,An.current);Ks(t,n),i=O1(null,t,r,e,i,n);var o=_1();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Qn(r)?(o=!0,kp(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,w1(t),i.updater=ph,t.stateNode=i,i._reactInternals=t,R0(t,r,e,n),t=$0(null,t,r,!0,o,n)):(t.tag=0,$t&&o&&h1(t),Ln(null,t,i,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Xd(e,t),e=t.pendingProps,i=r._init,r=i(r._payload),t.type=r,i=t.tag=_F(r),e=oi(r,e),i){case 0:t=M0(null,t,r,e,n);break e;case 1:t=Zk(null,t,r,e,n);break e;case 11:t=Xk(null,t,r,e,n);break e;case 14:t=Qk(null,t,r,oi(r.type,e),n);break e}throw Error(ie(306,r,""))}return t;case 0:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:oi(r,i),M0(e,t,r,i,n);case 1:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:oi(r,i),Zk(e,t,r,i,n);case 3:e:{if(rP(t),e===null)throw Error(ie(387));r=t.pendingProps,o=t.memoizedState,i=o.element,__(e,t),Pp(t,r,null,n);var s=t.memoizedState;if(r=s.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=cl(Error(ie(423)),t),t=Jk(e,t,r,n,i);break e}else if(r!==i){i=cl(Error(ie(424)),t),t=Jk(e,t,r,n,i);break e}else for(mr=zo(t.stateNode.containerInfo.firstChild),vr=t,$t=!0,si=null,n=R_(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(sl(),r===i){t=to(e,t,n);break e}Ln(e,t,r,n)}t=t.child}return t;case 5:return A_(t),e===null&&P0(t),r=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,s=i.children,k0(r,i)?s=null:o!==null&&k0(r,o)&&(t.flags|=32),nP(e,t),Ln(e,t,s,n),t.child;case 6:return e===null&&P0(t),null;case 13:return iP(e,t,n);case 4:return S1(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=ll(t,null,r,n):Ln(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:oi(r,i),Xk(e,t,r,i,n);case 7:return Ln(e,t,t.pendingProps,n),t.child;case 8:return Ln(e,t,t.pendingProps.children,n),t.child;case 12:return Ln(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,o=t.memoizedProps,s=i.value,bt(Op,r._currentValue),r._currentValue=s,o!==null)if(pi(o.value,s)){if(o.children===i.children&&!Xn.current){t=to(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){s=o.child;for(var c=u.firstContext;c!==null;){if(c.context===r){if(o.tag===1){c=Qi(-1,n&-n),c.tag=2;var f=o.updateQueue;if(f!==null){f=f.shared;var p=f.pending;p===null?c.next=c:(c.next=p.next,p.next=c),f.pending=c}}o.lanes|=n,c=o.alternate,c!==null&&(c.lanes|=n),T0(o.return,n,t),u.lanes|=n;break}c=c.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(ie(341));s.lanes|=n,u=s.alternate,u!==null&&(u.lanes|=n),T0(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}Ln(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=t.pendingProps.children,Ks(t,n),i=Gr(i),r=r(i),t.flags|=1,Ln(e,t,r,n),t.child;case 14:return r=t.type,i=oi(r,t.pendingProps),i=oi(r.type,i),Qk(e,t,r,i,n);case 15:return eP(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:oi(r,i),Xd(e,t),t.tag=1,Qn(r)?(e=!0,kp(t)):e=!1,Ks(t,n),T_(t,r,i),R0(t,r,i,n),$0(null,t,r,!0,e,n);case 19:return oP(e,t,n);case 22:return tP(e,t,n)}throw Error(ie(156,t.tag))};function wP(e,t){return qO(e,t)}function OF(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Br(e,t,n,r){return new OF(e,t,n,r)}function L1(e){return e=e.prototype,!(!e||!e.isReactComponent)}function _F(e){if(typeof e=="function")return L1(e)?1:0;if(e!=null){if(e=e.$$typeof,e===n1)return 11;if(e===r1)return 14}return 2}function Uo(e,t){var n=e.alternate;return n===null?(n=Br(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Jd(e,t,n,r,i,o){var s=2;if(r=e,typeof e=="function")L1(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case Is:return La(n.children,i,o,t);case t1:s=8,i|=8;break;case t0:return e=Br(12,n,t,i|2),e.elementType=t0,e.lanes=o,e;case n0:return e=Br(13,n,t,i),e.elementType=n0,e.lanes=o,e;case r0:return e=Br(19,n,t,i),e.elementType=r0,e.lanes=o,e;case IO:return vh(n,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case PO:s=10;break e;case TO:s=9;break e;case n1:s=11;break e;case r1:s=14;break e;case _o:s=16,r=null;break e}throw Error(ie(130,e==null?e:typeof e,""))}return t=Br(s,n,t,i),t.elementType=e,t.type=r,t.lanes=o,t}function La(e,t,n,r){return e=Br(7,e,r,t),e.lanes=n,e}function vh(e,t,n,r){return e=Br(22,e,r,t),e.elementType=IO,e.lanes=n,e.stateNode={isHidden:!1},e}function dv(e,t,n){return e=Br(6,e,null,t),e.lanes=n,e}function pv(e,t,n){return t=Br(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function PF(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=qg(0),this.expirationTimes=qg(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=qg(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function F1(e,t,n,r,i,o,s,u,c){return e=new PF(e,t,n,u,c),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Br(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},w1(o),e}function TF(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(n){console.error(n)}}t(),e.exports=Sr})(Xa);const wd=qy(Xa.exports);var EP,f2=Xa.exports;EP=f2.createRoot,f2.hydrateRoot;var OP={exports:{}},_P={};var dl=T.exports;function $F(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var DF=typeof Object.is=="function"?Object.is:$F,NF=dl.useState,LF=dl.useEffect,FF=dl.useLayoutEffect,zF=dl.useDebugValue;function BF(e,t){var n=t(),r=NF({inst:{value:n,getSnapshot:t}}),i=r[0].inst,o=r[1];return FF(function(){i.value=n,i.getSnapshot=t,hv(i)&&o({inst:i})},[e,n,t]),LF(function(){return hv(i)&&o({inst:i}),e(function(){hv(i)&&o({inst:i})})},[e]),zF(n),n}function hv(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!DF(e,n)}catch{return!0}}function jF(e,t){return t()}var WF=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?jF:BF;_P.useSyncExternalStore=dl.useSyncExternalStore!==void 0?dl.useSyncExternalStore:WF;(function(e){e.exports=_P})(OP);var PP={exports:{}},TP={};var Sh=T.exports,UF=OP.exports;function HF(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var VF=typeof Object.is=="function"?Object.is:HF,GF=UF.useSyncExternalStore,qF=Sh.useRef,YF=Sh.useEffect,KF=Sh.useMemo,XF=Sh.useDebugValue;TP.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var o=qF(null);if(o.current===null){var s={hasValue:!1,value:null};o.current=s}else s=o.current;o=KF(function(){function c(v){if(!f){if(f=!0,p=v,v=r(v),i!==void 0&&s.hasValue){var y=s.value;if(i(y,v))return h=y}return h=v}if(y=h,VF(p,v))return y;var b=r(v);return i!==void 0&&i(y,b)?y:(p=v,h=b)}var f=!1,p,h,g=n===void 0?null:n;return[function(){return c(t())},g===null?void 0:function(){return c(g())}]},[t,n,r,i]);var u=GF(e,o[0],o[1]);return YF(function(){s.hasValue=!0,s.value=u},[u]),XF(u),u};(function(e){e.exports=TP})(PP);function QF(e){e()}let IP=QF;const ZF=e=>IP=e,JF=()=>IP,Ko=T.exports.createContext(null);function RP(){return T.exports.useContext(Ko)}const ez=()=>{throw new Error("uSES not initialized!")};let AP=ez;const tz=e=>{AP=e},nz=(e,t)=>e===t;function rz(e=Ko){const t=e===Ko?RP:()=>T.exports.useContext(e);return function(r,i=nz){const{store:o,subscription:s,getServerState:u}=t(),c=AP(s.addNestedSub,o.getState,u||o.getState,r,i);return T.exports.useDebugValue(c),c}}const iz=rz();function z(){return z=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[i]=e[i]);return n}var MP={exports:{}},lt={};var pn=typeof Symbol=="function"&&Symbol.for,W1=pn?Symbol.for("react.element"):60103,U1=pn?Symbol.for("react.portal"):60106,kh=pn?Symbol.for("react.fragment"):60107,Ch=pn?Symbol.for("react.strict_mode"):60108,Eh=pn?Symbol.for("react.profiler"):60114,Oh=pn?Symbol.for("react.provider"):60109,_h=pn?Symbol.for("react.context"):60110,H1=pn?Symbol.for("react.async_mode"):60111,Ph=pn?Symbol.for("react.concurrent_mode"):60111,Th=pn?Symbol.for("react.forward_ref"):60112,Ih=pn?Symbol.for("react.suspense"):60113,az=pn?Symbol.for("react.suspense_list"):60120,Rh=pn?Symbol.for("react.memo"):60115,Ah=pn?Symbol.for("react.lazy"):60116,sz=pn?Symbol.for("react.block"):60121,lz=pn?Symbol.for("react.fundamental"):60117,uz=pn?Symbol.for("react.responder"):60118,cz=pn?Symbol.for("react.scope"):60119;function Cr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case W1:switch(e=e.type,e){case H1:case Ph:case kh:case Eh:case Ch:case Ih:return e;default:switch(e=e&&e.$$typeof,e){case _h:case Th:case Ah:case Rh:case Oh:return e;default:return t}}case U1:return t}}}function $P(e){return Cr(e)===Ph}lt.AsyncMode=H1;lt.ConcurrentMode=Ph;lt.ContextConsumer=_h;lt.ContextProvider=Oh;lt.Element=W1;lt.ForwardRef=Th;lt.Fragment=kh;lt.Lazy=Ah;lt.Memo=Rh;lt.Portal=U1;lt.Profiler=Eh;lt.StrictMode=Ch;lt.Suspense=Ih;lt.isAsyncMode=function(e){return $P(e)||Cr(e)===H1};lt.isConcurrentMode=$P;lt.isContextConsumer=function(e){return Cr(e)===_h};lt.isContextProvider=function(e){return Cr(e)===Oh};lt.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===W1};lt.isForwardRef=function(e){return Cr(e)===Th};lt.isFragment=function(e){return Cr(e)===kh};lt.isLazy=function(e){return Cr(e)===Ah};lt.isMemo=function(e){return Cr(e)===Rh};lt.isPortal=function(e){return Cr(e)===U1};lt.isProfiler=function(e){return Cr(e)===Eh};lt.isStrictMode=function(e){return Cr(e)===Ch};lt.isSuspense=function(e){return Cr(e)===Ih};lt.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===kh||e===Ph||e===Eh||e===Ch||e===Ih||e===az||typeof e=="object"&&e!==null&&(e.$$typeof===Ah||e.$$typeof===Rh||e.$$typeof===Oh||e.$$typeof===_h||e.$$typeof===Th||e.$$typeof===lz||e.$$typeof===uz||e.$$typeof===cz||e.$$typeof===sz)};lt.typeOf=Cr;(function(e){e.exports=lt})(MP);var DP=MP.exports,fz={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},dz={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},NP={};NP[DP.ForwardRef]=fz;NP[DP.Memo]=dz;var Lp={exports:{}},ut={};var V1=Symbol.for("react.element"),G1=Symbol.for("react.portal"),Mh=Symbol.for("react.fragment"),$h=Symbol.for("react.strict_mode"),Dh=Symbol.for("react.profiler"),Nh=Symbol.for("react.provider"),Lh=Symbol.for("react.context"),pz=Symbol.for("react.server_context"),Fh=Symbol.for("react.forward_ref"),zh=Symbol.for("react.suspense"),Bh=Symbol.for("react.suspense_list"),jh=Symbol.for("react.memo"),Wh=Symbol.for("react.lazy"),hz=Symbol.for("react.offscreen"),LP;LP=Symbol.for("react.module.reference");function Xr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case V1:switch(e=e.type,e){case Mh:case Dh:case $h:case zh:case Bh:return e;default:switch(e=e&&e.$$typeof,e){case pz:case Lh:case Fh:case Wh:case jh:case Nh:return e;default:return t}}case G1:return t}}}ut.ContextConsumer=Lh;ut.ContextProvider=Nh;ut.Element=V1;ut.ForwardRef=Fh;ut.Fragment=Mh;ut.Lazy=Wh;ut.Memo=jh;ut.Portal=G1;ut.Profiler=Dh;ut.StrictMode=$h;ut.Suspense=zh;ut.SuspenseList=Bh;ut.isAsyncMode=function(){return!1};ut.isConcurrentMode=function(){return!1};ut.isContextConsumer=function(e){return Xr(e)===Lh};ut.isContextProvider=function(e){return Xr(e)===Nh};ut.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===V1};ut.isForwardRef=function(e){return Xr(e)===Fh};ut.isFragment=function(e){return Xr(e)===Mh};ut.isLazy=function(e){return Xr(e)===Wh};ut.isMemo=function(e){return Xr(e)===jh};ut.isPortal=function(e){return Xr(e)===G1};ut.isProfiler=function(e){return Xr(e)===Dh};ut.isStrictMode=function(e){return Xr(e)===$h};ut.isSuspense=function(e){return Xr(e)===zh};ut.isSuspenseList=function(e){return Xr(e)===Bh};ut.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Mh||e===Dh||e===$h||e===zh||e===Bh||e===hz||typeof e=="object"&&e!==null&&(e.$$typeof===Wh||e.$$typeof===jh||e.$$typeof===Nh||e.$$typeof===Lh||e.$$typeof===Fh||e.$$typeof===LP||e.getModuleId!==void 0)};ut.typeOf=Xr;(function(e){e.exports=ut})(Lp);const mz=qy(Lp.exports);function gz(){const e=JF();let t=null,n=null;return{clear(){t=null,n=null},notify(){e(()=>{let r=t;for(;r;)r.callback(),r=r.next})},get(){let r=[],i=t;for(;i;)r.push(i),i=i.next;return r},subscribe(r){let i=!0,o=n={callback:r,next:null,prev:n};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:n=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const d2={notify(){},get:()=>[]};function vz(e,t){let n,r=d2;function i(h){return c(),r.subscribe(h)}function o(){r.notify()}function s(){p.onStateChange&&p.onStateChange()}function u(){return Boolean(n)}function c(){n||(n=t?t.addNestedSub(s):e.subscribe(s),r=gz())}function f(){n&&(n(),n=void 0,r.clear(),r=d2)}const p={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:s,isSubscribed:u,trySubscribe:c,tryUnsubscribe:f,getListeners:()=>r};return p}const yz=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",xz=yz?T.exports.useLayoutEffect:T.exports.useEffect;function bz({store:e,context:t,children:n,serverState:r}){const i=T.exports.useMemo(()=>{const u=vz(e);return{store:e,subscription:u,getServerState:r?()=>r:void 0}},[e,r]),o=T.exports.useMemo(()=>e.getState(),[e]);xz(()=>{const{subscription:u}=i;return u.onStateChange=u.notifyNestedSubs,u.trySubscribe(),o!==e.getState()&&u.notifyNestedSubs(),()=>{u.tryUnsubscribe(),u.onStateChange=void 0}},[i,o]);const s=t||Ko;return Ye.createElement(s.Provider,{value:i},n)}function FP(e=Ko){const t=e===Ko?RP:()=>T.exports.useContext(e);return function(){const{store:r}=t();return r}}const wz=FP();function Sz(e=Ko){const t=e===Ko?wz:FP(e);return function(){return t().dispatch}}const kz=Sz();tz(PP.exports.useSyncExternalStoreWithSelector);ZF(Xa.exports.unstable_batchedUpdates);const zP=T.exports.createContext({dragDropManager:void 0});function Cc(e){return Cc=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Cc(e)}function Cz(e,t){if(Cc(e)!=="object"||e===null)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||"default");if(Cc(r)!=="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ez(e){var t=Cz(e,"string");return Cc(t)==="symbol"?t:String(t)}function Oz(e,t,n){return t=Ez(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p2(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function h2(e){for(var t=1;t"u"&&(n=t,t=void 0),typeof n<"u"){if(typeof n!="function")throw new Error(Tn(1));return n(q1)(e,t)}if(typeof e!="function")throw new Error(Tn(2));var i=e,o=t,s=[],u=s,c=!1;function f(){u===s&&(u=s.slice())}function p(){if(c)throw new Error(Tn(3));return o}function h(b){if(typeof b!="function")throw new Error(Tn(4));if(c)throw new Error(Tn(5));var C=!0;return f(),u.push(b),function(){if(!!C){if(c)throw new Error(Tn(6));C=!1,f();var w=u.indexOf(b);u.splice(w,1),s=null}}}function g(b){if(!_z(b))throw new Error(Tn(7));if(typeof b.type>"u")throw new Error(Tn(8));if(c)throw new Error(Tn(9));try{c=!0,o=i(o,b)}finally{c=!1}for(var C=s=u,x=0;x"u")throw new Error(Tn(12));if(typeof n(void 0,{type:Fp.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Tn(13))})}function Tz(e){for(var t=Object.keys(e),n={},r=0;r"u")throw f&&f.type,new Error(Tn(14));h[v]=C,p=p||C!==b}return p=p||o.length!==Object.keys(c).length,p?h:c}}function zp(){for(var e=arguments.length,t=new Array(e),n=0;nr&&r[i]?r[i]:n||null,e)}function Mz(e,t){return e.filter(n=>n!==t)}function BP(e){return typeof e=="object"}function $z(e,t){const n=new Map,r=o=>{n.set(o,n.has(o)?n.get(o)+1:1)};e.forEach(r),t.forEach(r);const i=[];return n.forEach((o,s)=>{o===1&&i.push(s)}),i}function Dz(e,t){return e.filter(n=>t.indexOf(n)>-1)}const Y1="dnd-core/INIT_COORDS",Uh="dnd-core/BEGIN_DRAG",K1="dnd-core/PUBLISH_DRAG_SOURCE",Hh="dnd-core/HOVER",Vh="dnd-core/DROP",Gh="dnd-core/END_DRAG";function g2(e,t){return{type:Y1,payload:{sourceClientOffset:t||null,clientOffset:e||null}}}const Nz={type:Y1,payload:{clientOffset:null,sourceClientOffset:null}};function Lz(e){return function(n=[],r={publishSource:!0}){const{publishSource:i=!0,clientOffset:o,getSourceClientOffset:s}=r,u=e.getMonitor(),c=e.getRegistry();e.dispatch(g2(o)),Fz(n,u,c);const f=jz(n,u);if(f==null){e.dispatch(Nz);return}let p=null;if(o){if(!s)throw new Error("getSourceClientOffset must be defined");zz(s),p=s(f)}e.dispatch(g2(o,p));const g=c.getSource(f).beginDrag(u,f);if(g==null)return;Bz(g),c.pinSource(f);const v=c.getSourceType(f);return{type:Uh,payload:{itemType:v,item:g,sourceId:f,clientOffset:o||null,sourceClientOffset:p||null,isSourcePublic:!!i}}}}function Fz(e,t,n){$e(!t.isDragging(),"Cannot call beginDrag while dragging."),e.forEach(function(r){$e(n.getSource(r),"Expected sourceIds to be registered.")})}function zz(e){$e(typeof e=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function Bz(e){$e(BP(e),"Item must be an object.")}function jz(e,t){let n=null;for(let r=e.length-1;r>=0;r--)if(t.canDragSource(e[r])){n=e[r];break}return n}function Wz(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Uz(e){for(var t=1;t{const c=Gz(s,u,i,r),f={type:Vh,payload:{dropResult:Uz({},n,c)}};e.dispatch(f)})}}function Vz(e){$e(e.isDragging(),"Cannot call drop while not dragging."),$e(!e.didDrop(),"Cannot call drop twice during one drag operation.")}function Gz(e,t,n,r){const i=n.getTarget(e);let o=i?i.drop(r,e):void 0;return qz(o),typeof o>"u"&&(o=t===0?{}:r.getDropResult()),o}function qz(e){$e(typeof e>"u"||BP(e),"Drop result must either be an object or undefined.")}function Yz(e){const t=e.getTargetIds().filter(e.canDropOnTarget,e);return t.reverse(),t}function Kz(e){return function(){const n=e.getMonitor(),r=e.getRegistry();Xz(n);const i=n.getSourceId();return i!=null&&(r.getSource(i,!0).endDrag(n,i),r.unpinSource()),{type:Gh}}}function Xz(e){$e(e.isDragging(),"Cannot call endDrag while not dragging.")}function G0(e,t){return t===null?e===null:Array.isArray(e)?e.some(n=>n===t):e===t}function Qz(e){return function(n,{clientOffset:r}={}){Zz(n);const i=n.slice(0),o=e.getMonitor(),s=e.getRegistry(),u=o.getItemType();return e8(i,s,u),Jz(i,o,s),t8(i,o,s),{type:Hh,payload:{targetIds:i,clientOffset:r||null}}}}function Zz(e){$e(Array.isArray(e),"Expected targetIds to be an array.")}function Jz(e,t,n){$e(t.isDragging(),"Cannot call hover while not dragging."),$e(!t.didDrop(),"Cannot call hover after drop.");for(let r=0;r=0;r--){const i=e[r],o=t.getTargetType(i);G0(o,n)||e.splice(r,1)}}function t8(e,t,n){e.forEach(function(r){n.getTarget(r).hover(t,r)})}function n8(e){return function(){if(e.getMonitor().isDragging())return{type:K1}}}function r8(e){return{beginDrag:Lz(e),publishDragSource:n8(e),hover:Qz(e),drop:Hz(e),endDrag:Kz(e)}}class i8{receiveBackend(t){this.backend=t}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const t=this,{dispatch:n}=this.store;function r(o){return(...s)=>{const u=o.apply(t,s);typeof u<"u"&&n(u)}}const i=r8(this);return Object.keys(i).reduce((o,s)=>{const u=i[s];return o[s]=r(u),o},{})}dispatch(t){this.store.dispatch(t)}constructor(t,n){this.isSetUp=!1,this.handleRefCountChange=()=>{const r=this.store.getState().refCount>0;this.backend&&(r&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!r&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=t,this.monitor=n,t.subscribe(this.handleRefCountChange)}}function o8(e,t){return{x:e.x+t.x,y:e.y+t.y}}function jP(e,t){return{x:e.x-t.x,y:e.y-t.y}}function a8(e){const{clientOffset:t,initialClientOffset:n,initialSourceClientOffset:r}=e;return!t||!n||!r?null:jP(o8(t,r),n)}function s8(e){const{clientOffset:t,initialClientOffset:n}=e;return!t||!n?null:jP(t,n)}const Xu=[],X1=[];Xu.__IS_NONE__=!0;X1.__IS_ALL__=!0;function l8(e,t){return e===Xu?!1:e===X1||typeof t>"u"?!0:Dz(t,e).length>0}class u8{subscribeToStateChange(t,n={}){const{handlerIds:r}=n;$e(typeof t=="function","listener must be a function."),$e(typeof r>"u"||Array.isArray(r),"handlerIds, when specified, must be an array of strings.");let i=this.store.getState().stateId;const o=()=>{const s=this.store.getState(),u=s.stateId;try{u===i||u===i+1&&!l8(s.dirtyHandlerIds,r)||t()}finally{i=u}};return this.store.subscribe(o)}subscribeToOffsetChange(t){$e(typeof t=="function","listener must be a function.");let n=this.store.getState().dragOffset;const r=()=>{const i=this.store.getState().dragOffset;i!==n&&(n=i,t())};return this.store.subscribe(r)}canDragSource(t){if(!t)return!1;const n=this.registry.getSource(t);return $e(n,`Expected to find a valid source. sourceId=${t}`),this.isDragging()?!1:n.canDrag(this,t)}canDropOnTarget(t){if(!t)return!1;const n=this.registry.getTarget(t);if($e(n,`Expected to find a valid target. targetId=${t}`),!this.isDragging()||this.didDrop())return!1;const r=this.registry.getTargetType(t),i=this.getItemType();return G0(r,i)&&n.canDrop(this,t)}isDragging(){return Boolean(this.getItemType())}isDraggingSource(t){if(!t)return!1;const n=this.registry.getSource(t,!0);if($e(n,`Expected to find a valid source. sourceId=${t}`),!this.isDragging()||!this.isSourcePublic())return!1;const r=this.registry.getSourceType(t),i=this.getItemType();return r!==i?!1:n.isDragging(this,t)}isOverTarget(t,n={shallow:!1}){if(!t)return!1;const{shallow:r}=n;if(!this.isDragging())return!1;const i=this.registry.getTargetType(t),o=this.getItemType();if(o&&!G0(i,o))return!1;const s=this.getTargetIds();if(!s.length)return!1;const u=s.indexOf(t);return r?u===s.length-1:u>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return Boolean(this.store.getState().dragOperation.isSourcePublic)}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return a8(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return s8(this.store.getState().dragOffset)}constructor(t,n){this.store=t,this.registry=n}}const v2=typeof global<"u"?global:self,WP=v2.MutationObserver||v2.WebKitMutationObserver;function UP(e){return function(){const n=setTimeout(i,0),r=setInterval(i,50);function i(){clearTimeout(n),clearInterval(r),e()}}}function c8(e){let t=1;const n=new WP(e),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){t=-t,r.data=t}}const f8=typeof WP=="function"?c8:UP;class d8{enqueueTask(t){const{queue:n,requestFlush:r}=this;n.length||(r(),this.flushing=!0),n[n.length]=t}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:t}=this;for(;this.indexthis.capacity){for(let r=0,i=t.length-this.index;r{this.pendingErrors.push(t),this.requestErrorThrow()},this.requestFlush=f8(this.flush),this.requestErrorThrow=UP(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class p8{call(){try{this.task&&this.task()}catch(t){this.onError(t)}finally{this.task=null,this.release(this)}}constructor(t,n){this.onError=t,this.release=n,this.task=null}}class h8{create(t){const n=this.freeTasks,r=n.length?n.pop():new p8(this.onError,i=>n[n.length]=i);return r.task=t,r}constructor(t){this.onError=t,this.freeTasks=[]}}const HP=new d8,m8=new h8(HP.registerPendingError);function g8(e){HP.enqueueTask(m8.create(e))}const Q1="dnd-core/ADD_SOURCE",Z1="dnd-core/ADD_TARGET",J1="dnd-core/REMOVE_SOURCE",qh="dnd-core/REMOVE_TARGET";function v8(e){return{type:Q1,payload:{sourceId:e}}}function y8(e){return{type:Z1,payload:{targetId:e}}}function x8(e){return{type:J1,payload:{sourceId:e}}}function b8(e){return{type:qh,payload:{targetId:e}}}function w8(e){$e(typeof e.canDrag=="function","Expected canDrag to be a function."),$e(typeof e.beginDrag=="function","Expected beginDrag to be a function."),$e(typeof e.endDrag=="function","Expected endDrag to be a function.")}function S8(e){$e(typeof e.canDrop=="function","Expected canDrop to be a function."),$e(typeof e.hover=="function","Expected hover to be a function."),$e(typeof e.drop=="function","Expected beginDrag to be a function.")}function q0(e,t){if(t&&Array.isArray(e)){e.forEach(n=>q0(n,!1));return}$e(typeof e=="string"||typeof e=="symbol",t?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var Fr;(function(e){e.SOURCE="SOURCE",e.TARGET="TARGET"})(Fr||(Fr={}));let k8=0;function C8(){return k8++}function E8(e){const t=C8().toString();switch(e){case Fr.SOURCE:return`S${t}`;case Fr.TARGET:return`T${t}`;default:throw new Error(`Unknown Handler Role: ${e}`)}}function y2(e){switch(e[0]){case"S":return Fr.SOURCE;case"T":return Fr.TARGET;default:throw new Error(`Cannot parse handler ID: ${e}`)}}function x2(e,t){const n=e.entries();let r=!1;do{const{done:i,value:[,o]}=n.next();if(o===t)return!0;r=!!i}while(!r);return!1}class O8{addSource(t,n){q0(t),w8(n);const r=this.addHandler(Fr.SOURCE,t,n);return this.store.dispatch(v8(r)),r}addTarget(t,n){q0(t,!0),S8(n);const r=this.addHandler(Fr.TARGET,t,n);return this.store.dispatch(y8(r)),r}containsHandler(t){return x2(this.dragSources,t)||x2(this.dropTargets,t)}getSource(t,n=!1){return $e(this.isSourceId(t),"Expected a valid source ID."),n&&t===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(t)}getTarget(t){return $e(this.isTargetId(t),"Expected a valid target ID."),this.dropTargets.get(t)}getSourceType(t){return $e(this.isSourceId(t),"Expected a valid source ID."),this.types.get(t)}getTargetType(t){return $e(this.isTargetId(t),"Expected a valid target ID."),this.types.get(t)}isSourceId(t){return y2(t)===Fr.SOURCE}isTargetId(t){return y2(t)===Fr.TARGET}removeSource(t){$e(this.getSource(t),"Expected an existing source."),this.store.dispatch(x8(t)),g8(()=>{this.dragSources.delete(t),this.types.delete(t)})}removeTarget(t){$e(this.getTarget(t),"Expected an existing target."),this.store.dispatch(b8(t)),this.dropTargets.delete(t),this.types.delete(t)}pinSource(t){const n=this.getSource(t);$e(n,"Expected an existing source."),this.pinnedSourceId=t,this.pinnedSource=n}unpinSource(){$e(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(t,n,r){const i=E8(t);return this.types.set(i,n),t===Fr.SOURCE?this.dragSources.set(i,r):t===Fr.TARGET&&this.dropTargets.set(i,r),i}constructor(t){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=t}}const _8=(e,t)=>e===t;function P8(e,t){return!e&&!t?!0:!e||!t?!1:e.x===t.x&&e.y===t.y}function T8(e,t,n=_8){if(e.length!==t.length)return!1;for(let r=0;r0||!T8(n,r)))return Xu;const s=r[r.length-1],u=n[n.length-1];return s!==u&&(s&&i.push(s),u&&i.push(u)),i}function R8(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function A8(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,r)||(n[r]=e[r]))}return n}function V8(e,t){if(e==null)return{};var n={},r=Object.keys(e),i,o;for(o=0;o=0)&&(n[i]=e[i]);return n}let w2=0;const ep=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var G8=T.exports.memo(function(t){var{children:n}=t,r=H8(t,["children"]);const[i,o]=q8(r);return T.exports.useEffect(()=>{if(o){const s=VP();return++w2,()=>{--w2===0&&(s[ep]=null)}}},[]),N(zP.Provider,{value:i,children:n})});function q8(e){if("manager"in e)return[{dragDropManager:e.manager},!1];const t=Y8(e.backend,e.context,e.options,e.debugMode),n=!e.context;return[t,n]}function Y8(e,t=VP(),n,r){const i=t;return i[ep]||(i[ep]={dragDropManager:W8(e,t,n,r)}),i[ep]}function VP(){return typeof global<"u"?global:window}var K8=function e(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var r,i,o;if(Array.isArray(t)){if(r=t.length,r!=n.length)return!1;for(i=r;i--!==0;)if(!e(t[i],n[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if(o=Object.keys(t),r=o.length,r!==Object.keys(n).length)return!1;for(i=r;i--!==0;)if(!Object.prototype.hasOwnProperty.call(n,o[i]))return!1;for(i=r;i--!==0;){var s=o[i];if(!e(t[s],n[s]))return!1}return!0}return t!==t&&n!==n};const Va=typeof window<"u"?T.exports.useLayoutEffect:T.exports.useEffect;function GP(e,t,n){const[r,i]=T.exports.useState(()=>t(e)),o=T.exports.useCallback(()=>{const s=t(e);K8(r,s)||(i(s),n&&n())},[r,e,n]);return Va(o),[r,o]}function X8(e,t,n){const[r,i]=GP(e,t,n);return Va(function(){const s=e.getHandlerId();if(s!=null)return e.subscribeToStateChange(i,{handlerIds:[s]})},[e,i]),r}function qP(e,t,n){return X8(t,e||(()=>({})),()=>n.reconnect())}function YP(e,t){const n=[...t||[]];return t==null&&typeof e!="function"&&n.push(e),T.exports.useMemo(()=>typeof e=="function"?e():e,n)}function Q8(e){return T.exports.useMemo(()=>e.hooks.dragSource(),[e])}function Z8(e){return T.exports.useMemo(()=>e.hooks.dragPreview(),[e])}let gv=!1,vv=!1;class J8{receiveHandlerId(t){this.sourceId=t}getHandlerId(){return this.sourceId}canDrag(){$e(!gv,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return gv=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{gv=!1}}isDragging(){if(!this.sourceId)return!1;$e(!vv,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return vv=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{vv=!1}}subscribeToStateChange(t,n){return this.internalMonitor.subscribeToStateChange(t,n)}isDraggingSource(t){return this.internalMonitor.isDraggingSource(t)}isOverTarget(t,n){return this.internalMonitor.isOverTarget(t,n)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(t){return this.internalMonitor.subscribeToOffsetChange(t)}canDragSource(t){return this.internalMonitor.canDragSource(t)}canDropOnTarget(t){return this.internalMonitor.canDropOnTarget(t)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.sourceId=null,this.internalMonitor=t.getMonitor()}}let yv=!1;class e9{receiveHandlerId(t){this.targetId=t}getHandlerId(){return this.targetId}subscribeToStateChange(t,n){return this.internalMonitor.subscribeToStateChange(t,n)}canDrop(){if(!this.targetId)return!1;$e(!yv,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return yv=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{yv=!1}}isOver(t){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,t):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.targetId=null,this.internalMonitor=t.getMonitor()}}function t9(e,t,n){const r=n.getRegistry(),i=r.addTarget(e,t);return[i,()=>r.removeTarget(i)]}function n9(e,t,n){const r=n.getRegistry(),i=r.addSource(e,t);return[i,()=>r.removeSource(i)]}function Y0(e,t,n,r){let i=n?n.call(r,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!="object"||!e||typeof t!="object"||!t)return!1;const o=Object.keys(e),s=Object.keys(t);if(o.length!==s.length)return!1;const u=Object.prototype.hasOwnProperty.bind(t);for(let c=0;c, or turn it into a drag source or a drop target itself.`)}function i9(e){return(t=null,n=null)=>{if(!T.exports.isValidElement(t)){const o=t;return e(o,n),o}const r=t;return r9(r),o9(r,n?o=>e(o,n):e)}}function KP(e){const t={};return Object.keys(e).forEach(n=>{const r=e[n];if(n.endsWith("Ref"))t[n]=e[n];else{const i=i9(r);t[n]=()=>i}}),t}function S2(e,t){typeof e=="function"?e(t):e.current=t}function o9(e,t){const n=e.ref;return $e(typeof n!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),n?T.exports.cloneElement(e,{ref:r=>{S2(n,r),S2(t,r)}}):T.exports.cloneElement(e,{ref:t})}class a9{receiveHandlerId(t){this.handlerId!==t&&(this.handlerId=t,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(t){this.dragSourceOptionsInternal=t}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(t){this.dragPreviewOptionsInternal=t}reconnect(){const t=this.reconnectDragSource();this.reconnectDragPreview(t)}reconnectDragSource(){const t=this.dragSource,n=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return n&&this.disconnectDragSource(),this.handlerId?t?(n&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=t,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,t,this.dragSourceOptions)),n):(this.lastConnectedDragSource=t,n):n}reconnectDragPreview(t=!1){const n=this.dragPreview,r=t||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(r&&this.disconnectDragPreview(),!!this.handlerId){if(!n){this.lastConnectedDragPreview=n;return}r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=n,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,n,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!Y0(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!Y0(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(t){this.hooks=KP({dragSource:(n,r)=>{this.clearDragSource(),this.dragSourceOptions=r||null,K0(n)?this.dragSourceRef=n:this.dragSourceNode=n,this.reconnectDragSource()},dragPreview:(n,r)=>{this.clearDragPreview(),this.dragPreviewOptions=r||null,K0(n)?this.dragPreviewRef=n:this.dragPreviewNode=n,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=t}}class s9{get connectTarget(){return this.dropTarget}reconnect(){const t=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();t&&this.disconnectDropTarget();const n=this.dropTarget;if(!!this.handlerId){if(!n){this.lastConnectedDropTarget=n;return}t&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=n,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,n,this.dropTargetOptions))}}receiveHandlerId(t){t!==this.handlerId&&(this.handlerId=t,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(t){this.dropTargetOptionsInternal=t}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!Y0(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(t){this.hooks=KP({dropTarget:(n,r)=>{this.clearDropTarget(),this.dropTargetOptions=r,K0(n)?this.dropTargetRef=n:this.dropTargetNode=n,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=t}}function lo(){const{dragDropManager:e}=T.exports.useContext(zP);return $e(e!=null,"Expected drag drop context"),e}function l9(e,t){const n=lo(),r=T.exports.useMemo(()=>new a9(n.getBackend()),[n]);return Va(()=>(r.dragSourceOptions=e||null,r.reconnect(),()=>r.disconnectDragSource()),[r,e]),Va(()=>(r.dragPreviewOptions=t||null,r.reconnect(),()=>r.disconnectDragPreview()),[r,t]),r}function u9(){const e=lo();return T.exports.useMemo(()=>new J8(e),[e])}class c9{beginDrag(){const t=this.spec,n=this.monitor;let r=null;return typeof t.item=="object"?r=t.item:typeof t.item=="function"?r=t.item(n):r={},r??null}canDrag(){const t=this.spec,n=this.monitor;return typeof t.canDrag=="boolean"?t.canDrag:typeof t.canDrag=="function"?t.canDrag(n):!0}isDragging(t,n){const r=this.spec,i=this.monitor,{isDragging:o}=r;return o?o(i):n===t.getSourceId()}endDrag(){const t=this.spec,n=this.monitor,r=this.connector,{end:i}=t;i&&i(n.getItem(),n),r.reconnect()}constructor(t,n,r){this.spec=t,this.monitor=n,this.connector=r}}function f9(e,t,n){const r=T.exports.useMemo(()=>new c9(e,t,n),[t,n]);return T.exports.useEffect(()=>{r.spec=e},[e]),r}function d9(e){return T.exports.useMemo(()=>{const t=e.type;return $e(t!=null,"spec.type must be defined"),t},[e])}function p9(e,t,n){const r=lo(),i=f9(e,t,n),o=d9(e);Va(function(){if(o!=null){const[u,c]=n9(o,i,r);return t.receiveHandlerId(u),n.receiveHandlerId(u),c}},[r,t,n,i,o])}function h9(e,t){const n=YP(e,t);$e(!n.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const r=u9(),i=l9(n.options,n.previewOptions);return p9(n,r,i),[qP(n.collect,r,i),Q8(i),Z8(i)]}function m9(e){const n=lo().getMonitor(),[r,i]=GP(n,e);return T.exports.useEffect(()=>n.subscribeToOffsetChange(i)),T.exports.useEffect(()=>n.subscribeToStateChange(i)),r}function g9(e){return T.exports.useMemo(()=>e.hooks.dropTarget(),[e])}function v9(e){const t=lo(),n=T.exports.useMemo(()=>new s9(t.getBackend()),[t]);return Va(()=>(n.dropTargetOptions=e||null,n.reconnect(),()=>n.disconnectDropTarget()),[e]),n}function y9(){const e=lo();return T.exports.useMemo(()=>new e9(e),[e])}function x9(e){const{accept:t}=e;return T.exports.useMemo(()=>($e(e.accept!=null,"accept must be defined"),Array.isArray(t)?t:[t]),[t])}class b9{canDrop(){const t=this.spec,n=this.monitor;return t.canDrop?t.canDrop(n.getItem(),n):!0}hover(){const t=this.spec,n=this.monitor;t.hover&&t.hover(n.getItem(),n)}drop(){const t=this.spec,n=this.monitor;if(t.drop)return t.drop(n.getItem(),n)}constructor(t,n){this.spec=t,this.monitor=n}}function w9(e,t){const n=T.exports.useMemo(()=>new b9(e,t),[t]);return T.exports.useEffect(()=>{n.spec=e},[e]),n}function S9(e,t,n){const r=lo(),i=w9(e,t),o=x9(e);Va(function(){const[u,c]=t9(o,i,r);return t.receiveHandlerId(u),n.receiveHandlerId(u),c},[r,t,i,n,o.map(s=>s.toString()).join("|")])}function X0(e,t){const n=YP(e,t),r=y9(),i=v9(n.options);return S9(n,r,i),[qP(n.collect,r,i),g9(i)]}var Ho;(function(e){e.mouse="mouse",e.touch="touch",e.keyboard="keyboard"})(Ho||(Ho={}));class k9{get delay(){var t;return(t=this.args.delay)!==null&&t!==void 0?t:0}get scrollAngleRanges(){return this.args.scrollAngleRanges}get getDropTargetElementsAtPoint(){return this.args.getDropTargetElementsAtPoint}get ignoreContextMenu(){var t;return(t=this.args.ignoreContextMenu)!==null&&t!==void 0?t:!1}get enableHoverOutsideTarget(){var t;return(t=this.args.enableHoverOutsideTarget)!==null&&t!==void 0?t:!1}get enableKeyboardEvents(){var t;return(t=this.args.enableKeyboardEvents)!==null&&t!==void 0?t:!1}get enableMouseEvents(){var t;return(t=this.args.enableMouseEvents)!==null&&t!==void 0?t:!1}get enableTouchEvents(){var t;return(t=this.args.enableTouchEvents)!==null&&t!==void 0?t:!0}get touchSlop(){return this.args.touchSlop||0}get delayTouchStart(){var t,n,r,i;return(i=(r=(t=this.args)===null||t===void 0?void 0:t.delayTouchStart)!==null&&r!==void 0?r:(n=this.args)===null||n===void 0?void 0:n.delay)!==null&&i!==void 0?i:0}get delayMouseStart(){var t,n,r,i;return(i=(r=(t=this.args)===null||t===void 0?void 0:t.delayMouseStart)!==null&&r!==void 0?r:(n=this.args)===null||n===void 0?void 0:n.delay)!==null&&i!==void 0?i:0}get window(){if(this.context&&this.context.window)return this.context.window;if(typeof window<"u")return window}get document(){var t;if(!((t=this.context)===null||t===void 0)&&t.document)return this.context.document;if(this.window)return this.window.document}get rootElement(){var t;return((t=this.args)===null||t===void 0?void 0:t.rootElement)||this.document}constructor(t,n){this.args=t,this.context=n}}function C9(e,t,n,r){return Math.sqrt(Math.pow(Math.abs(n-e),2)+Math.pow(Math.abs(r-t),2))}function E9(e,t,n,r,i){if(!i)return!1;const o=Math.atan2(r-t,n-e)*180/Math.PI+180;for(let s=0;s=u.start)&&(u.end==null||o<=u.end))return!0}return!1}const O9={Left:1,Right:2,Center:4},_9={Left:0,Center:1,Right:2};function xv(e){return e.button===void 0||e.button===_9.Left}function P9(e){return e.buttons===void 0||(e.buttons&O9.Left)===0}function XP(e){return!!e.targetTouches}const T9=1;function I9(e){const t=e.nodeType===T9?e:e.parentElement;if(!t)return;const{top:n,left:r}=t.getBoundingClientRect();return{x:r,y:n}}function R9(e,t){if(e.targetTouches.length===1)return Bp(e.targetTouches[0]);if(t&&e.touches.length===1&&e.touches[0].target===t.target)return Bp(e.touches[0])}function Bp(e,t){return XP(e)?R9(e,t):{x:e.clientX,y:e.clientY}}const k2=(()=>{let e=!1;try{addEventListener("test",()=>{},Object.defineProperty({},"passive",{get(){return e=!0,!0}}))}catch{}return e})(),du={[Ho.mouse]:{start:"mousedown",move:"mousemove",end:"mouseup",contextmenu:"contextmenu"},[Ho.touch]:{start:"touchstart",move:"touchmove",end:"touchend"},[Ho.keyboard]:{keydown:"keydown"}};class Qu{profile(){var t;return{sourceNodes:this.sourceNodes.size,sourcePreviewNodes:this.sourcePreviewNodes.size,sourcePreviewNodeOptions:this.sourcePreviewNodeOptions.size,targetNodes:this.targetNodes.size,dragOverTargetIds:((t=this.dragOverTargetIds)===null||t===void 0?void 0:t.length)||0}}get document(){return this.options.document}setup(){const t=this.options.rootElement;!t||($e(!Qu.isSetUp,"Cannot have two Touch backends at the same time."),Qu.isSetUp=!0,this.addEventListener(t,"start",this.getTopMoveStartHandler()),this.addEventListener(t,"start",this.handleTopMoveStartCapture,!0),this.addEventListener(t,"move",this.handleTopMove),this.addEventListener(t,"move",this.handleTopMoveCapture,!0),this.addEventListener(t,"end",this.handleTopMoveEndCapture,!0),this.options.enableMouseEvents&&!this.options.ignoreContextMenu&&this.addEventListener(t,"contextmenu",this.handleTopMoveEndCapture),this.options.enableKeyboardEvents&&this.addEventListener(t,"keydown",this.handleCancelOnEscape,!0))}teardown(){const t=this.options.rootElement;!t||(Qu.isSetUp=!1,this._mouseClientOffset={},this.removeEventListener(t,"start",this.handleTopMoveStartCapture,!0),this.removeEventListener(t,"start",this.handleTopMoveStart),this.removeEventListener(t,"move",this.handleTopMoveCapture,!0),this.removeEventListener(t,"move",this.handleTopMove),this.removeEventListener(t,"end",this.handleTopMoveEndCapture,!0),this.options.enableMouseEvents&&!this.options.ignoreContextMenu&&this.removeEventListener(t,"contextmenu",this.handleTopMoveEndCapture),this.options.enableKeyboardEvents&&this.removeEventListener(t,"keydown",this.handleCancelOnEscape,!0),this.uninstallSourceNodeRemovalObserver())}addEventListener(t,n,r,i=!1){const o=k2?{capture:i,passive:!1}:i;this.listenerTypes.forEach(function(s){const u=du[s][n];u&&t.addEventListener(u,r,o)})}removeEventListener(t,n,r,i=!1){const o=k2?{capture:i,passive:!1}:i;this.listenerTypes.forEach(function(s){const u=du[s][n];u&&t.removeEventListener(u,r,o)})}connectDragSource(t,n){const r=this.handleMoveStart.bind(this,t);return this.sourceNodes.set(t,n),this.addEventListener(n,"start",r),()=>{this.sourceNodes.delete(t),this.removeEventListener(n,"start",r)}}connectDragPreview(t,n,r){return this.sourcePreviewNodeOptions.set(t,r),this.sourcePreviewNodes.set(t,n),()=>{this.sourcePreviewNodes.delete(t),this.sourcePreviewNodeOptions.delete(t)}}connectDropTarget(t,n){const r=this.options.rootElement;if(!this.document||!r)return()=>{};const i=o=>{if(!this.document||!r||!this.monitor.isDragging())return;let s;switch(o.type){case du.mouse.move:s={x:o.clientX,y:o.clientY};break;case du.touch.move:var u,c;s={x:((u=o.touches[0])===null||u===void 0?void 0:u.clientX)||0,y:((c=o.touches[0])===null||c===void 0?void 0:c.clientY)||0};break}const f=s!=null?this.document.elementFromPoint(s.x,s.y):void 0,p=f&&n.contains(f);if(f===n||p)return this.handleMove(o,t)};return this.addEventListener(this.document.body,"move",i),this.targetNodes.set(t,n),()=>{this.document&&(this.targetNodes.delete(t),this.removeEventListener(this.document.body,"move",i))}}getTopMoveStartHandler(){return!this.options.delayTouchStart&&!this.options.delayMouseStart?this.handleTopMoveStart:this.handleTopMoveStartDelay}installSourceNodeRemovalObserver(t){this.uninstallSourceNodeRemovalObserver(),this.draggedSourceNode=t,this.draggedSourceNodeRemovalObserver=new MutationObserver(()=>{t&&!t.parentElement&&(this.resurrectSourceNode(),this.uninstallSourceNodeRemovalObserver())}),!(!t||!t.parentElement)&&this.draggedSourceNodeRemovalObserver.observe(t.parentElement,{childList:!0})}resurrectSourceNode(){this.document&&this.draggedSourceNode&&(this.draggedSourceNode.style.display="none",this.draggedSourceNode.removeAttribute("data-reactid"),this.document.body.appendChild(this.draggedSourceNode))}uninstallSourceNodeRemovalObserver(){this.draggedSourceNodeRemovalObserver&&this.draggedSourceNodeRemovalObserver.disconnect(),this.draggedSourceNodeRemovalObserver=void 0,this.draggedSourceNode=void 0}constructor(t,n,r){this.getSourceClientOffset=i=>{const o=this.sourceNodes.get(i);return o&&I9(o)},this.handleTopMoveStartCapture=i=>{!xv(i)||(this.moveStartSourceIds=[])},this.handleMoveStart=i=>{Array.isArray(this.moveStartSourceIds)&&this.moveStartSourceIds.unshift(i)},this.handleTopMoveStart=i=>{if(!xv(i))return;const o=Bp(i);o&&(XP(i)&&(this.lastTargetTouchFallback=i.targetTouches[0]),this._mouseClientOffset=o),this.waitingForDelay=!1},this.handleTopMoveStartDelay=i=>{if(!xv(i))return;const o=i.type===du.touch.start?this.options.delayTouchStart:this.options.delayMouseStart;this.timeout=setTimeout(this.handleTopMoveStart.bind(this,i),o),this.waitingForDelay=!0},this.handleTopMoveCapture=()=>{this.dragOverTargetIds=[]},this.handleMove=(i,o)=>{this.dragOverTargetIds&&this.dragOverTargetIds.unshift(o)},this.handleTopMove=i=>{if(this.timeout&&clearTimeout(this.timeout),!this.document||this.waitingForDelay)return;const{moveStartSourceIds:o,dragOverTargetIds:s}=this,u=this.options.enableHoverOutsideTarget,c=Bp(i,this.lastTargetTouchFallback);if(!c)return;if(this._isScrolling||!this.monitor.isDragging()&&E9(this._mouseClientOffset.x||0,this._mouseClientOffset.y||0,c.x,c.y,this.options.scrollAngleRanges)){this._isScrolling=!0;return}if(!this.monitor.isDragging()&&this._mouseClientOffset.hasOwnProperty("x")&&o&&C9(this._mouseClientOffset.x||0,this._mouseClientOffset.y||0,c.x,c.y)>(this.options.touchSlop?this.options.touchSlop:0)&&(this.moveStartSourceIds=void 0,this.actions.beginDrag(o,{clientOffset:this._mouseClientOffset,getSourceClientOffset:this.getSourceClientOffset,publishSource:!1})),!this.monitor.isDragging())return;const f=this.sourceNodes.get(this.monitor.getSourceId());this.installSourceNodeRemovalObserver(f),this.actions.publishDragSource(),i.cancelable&&i.preventDefault();const p=(s||[]).map(y=>this.targetNodes.get(y)).filter(y=>!!y),h=this.options.getDropTargetElementsAtPoint?this.options.getDropTargetElementsAtPoint(c.x,c.y,p):this.document.elementsFromPoint(c.x,c.y),g=[];for(const y in h){if(!h.hasOwnProperty(y))continue;let b=h[y];for(b!=null&&g.push(b);b;)b=b.parentElement,b&&g.indexOf(b)===-1&&g.push(b)}const v=g.filter(y=>p.indexOf(y)>-1).map(y=>this._getDropTargetId(y)).filter(y=>!!y).filter((y,b,C)=>C.indexOf(y)===b);if(u)for(const y in this.targetNodes){const b=this.targetNodes.get(y);if(f&&b&&b.contains(f)&&v.indexOf(y)===-1){v.unshift(y);break}}v.reverse(),this.actions.hover(v,{clientOffset:c})},this._getDropTargetId=i=>{const o=this.targetNodes.keys();let s=o.next();for(;s.done===!1;){const u=s.value;if(i===this.targetNodes.get(u))return u;s=o.next()}},this.handleTopMoveEndCapture=i=>{if(this._isScrolling=!1,this.lastTargetTouchFallback=void 0,!!P9(i)){if(!this.monitor.isDragging()||this.monitor.didDrop()){this.moveStartSourceIds=void 0;return}i.cancelable&&i.preventDefault(),this._mouseClientOffset={},this.uninstallSourceNodeRemovalObserver(),this.actions.drop(),this.actions.endDrag()}},this.handleCancelOnEscape=i=>{i.key==="Escape"&&this.monitor.isDragging()&&(this._mouseClientOffset={},this.uninstallSourceNodeRemovalObserver(),this.actions.endDrag())},this.options=new k9(r,n),this.actions=t.getActions(),this.monitor=t.getMonitor(),this.sourceNodes=new Map,this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.targetNodes=new Map,this.listenerTypes=[],this._mouseClientOffset={},this._isScrolling=!1,this.options.enableMouseEvents&&this.listenerTypes.push(Ho.mouse),this.options.enableTouchEvents&&this.listenerTypes.push(Ho.touch),this.options.enableKeyboardEvents&&this.listenerTypes.push(Ho.keyboard)}}const A9=function(t,n={},r={}){return new Qu(t,n,r)};function li(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:ex(e)?2:tx(e)?3:0}function Qs(e,t){return Ol(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function M9(e,t){return Ol(e)===2?e.get(t):e[t]}function QP(e,t,n){var r=Ol(e);r===2?e.set(t,n):r===3?(e.delete(t),e.add(n)):e[t]=n}function ZP(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function ex(e){return F9&&e instanceof Map}function tx(e){return z9&&e instanceof Set}function Oa(e){return e.o||e.t}function nx(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=eT(e);delete t[Mt];for(var n=Zs(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=$9),Object.freeze(e),t&&Ga(e,function(n,r){return rx(r,!0)},!0)),e}function $9(){li(2)}function ix(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function Ti(e){var t=ty[e];return t||li(18,e),t}function D9(e,t){ty[e]||(ty[e]=t)}function Q0(){return Ec}function bv(e,t){t&&(Ti("Patches"),e.u=[],e.s=[],e.v=t)}function jp(e){Z0(e),e.p.forEach(N9),e.p=null}function Z0(e){e===Ec&&(Ec=e.l)}function C2(e){return Ec={p:[],l:Ec,h:e,m:!0,_:0}}function N9(e){var t=e[Mt];t.i===0||t.i===1?t.j():t.O=!0}function wv(e,t){t._=t.p.length;var n=t.p[0],r=e!==void 0&&e!==n;return t.h.g||Ti("ES5").S(t,e,r),r?(n[Mt].P&&(jp(t),li(4)),no(e)&&(e=Wp(t,e),t.l||Up(t,e)),t.u&&Ti("Patches").M(n[Mt].t,e,t.u,t.s)):e=Wp(t,n,[]),jp(t),t.u&&t.v(t.u,t.s),e!==JP?e:void 0}function Wp(e,t,n){if(ix(t))return t;var r=t[Mt];if(!r)return Ga(t,function(o,s){return E2(e,r,t,o,s,n)},!0),t;if(r.A!==e)return t;if(!r.P)return Up(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=r.i===4||r.i===5?r.o=nx(r.k):r.o;Ga(r.i===3?new Set(i):i,function(o,s){return E2(e,r,i,o,s,n)}),Up(e,i,!1),n&&e.u&&Ti("Patches").R(r,n,e.u,e.s)}return r.o}function E2(e,t,n,r,i,o){if(Xo(i)){var s=Wp(e,i,o&&t&&t.i!==3&&!Qs(t.D,r)?o.concat(r):void 0);if(QP(n,r,s),!Xo(s))return;e.m=!1}if(no(i)&&!ix(i)){if(!e.h.F&&e._<1)return;Wp(e,i),t&&t.A.l||Up(e,i)}}function Up(e,t,n){n===void 0&&(n=!1),e.h.F&&e.m&&rx(t,n)}function Sv(e,t){var n=e[Mt];return(n?Oa(n):e)[t]}function O2(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function Ro(e){e.P||(e.P=!0,e.l&&Ro(e.l))}function kv(e){e.o||(e.o=nx(e.t))}function J0(e,t,n){var r=ex(t)?Ti("MapSet").N(t,n):tx(t)?Ti("MapSet").T(t,n):e.g?function(i,o){var s=Array.isArray(i),u={i:s?1:0,A:o?o.A:Q0(),P:!1,I:!1,D:{},l:o,t:i,k:null,o:null,j:null,C:!1},c=u,f=Oc;s&&(c=[u],f=Nu);var p=Proxy.revocable(c,f),h=p.revoke,g=p.proxy;return u.k=g,u.j=h,g}(t,n):Ti("ES5").J(t,n);return(n?n.A:Q0()).p.push(r),r}function ey(e){return Xo(e)||li(22,e),function t(n){if(!no(n))return n;var r,i=n[Mt],o=Ol(n);if(i){if(!i.P&&(i.i<4||!Ti("ES5").K(i)))return i.t;i.I=!0,r=_2(n,o),i.I=!1}else r=_2(n,o);return Ga(r,function(s,u){i&&M9(i.t,s)===u||QP(r,s,t(u))}),o===3?new Set(r):r}(e)}function _2(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return nx(e)}function L9(){function e(o,s){var u=i[o];return u?u.enumerable=s:i[o]=u={configurable:!0,enumerable:s,get:function(){var c=this[Mt];return Oc.get(c,o)},set:function(c){var f=this[Mt];Oc.set(f,o,c)}},u}function t(o){for(var s=o.length-1;s>=0;s--){var u=o[s][Mt];if(!u.P)switch(u.i){case 5:r(u)&&Ro(u);break;case 4:n(u)&&Ro(u)}}}function n(o){for(var s=o.t,u=o.k,c=Zs(u),f=c.length-1;f>=0;f--){var p=c[f];if(p!==Mt){var h=s[p];if(h===void 0&&!Qs(s,p))return!0;var g=u[p],v=g&&g[Mt];if(v?v.t!==h:!ZP(g,h))return!0}}var y=!!s[Mt];return c.length!==Zs(s).length+(y?0:1)}function r(o){var s=o.k;if(s.length!==o.t.length)return!0;var u=Object.getOwnPropertyDescriptor(s,s.length-1);if(u&&!u.get)return!0;for(var c=0;c1?x-1:0),S=1;S1?p-1:0),g=1;g=0;i--){var o=r[i];if(o.path.length===0&&o.op==="replace"){n=o.value;break}}i>-1&&(r=r.slice(i+1));var s=Ti("Patches").$;return Xo(n)?s(n,r):this.produce(n,function(u){return s(u,r)})},e}(),wr=new j9,tT=wr.produce;wr.produceWithPatches.bind(wr);wr.setAutoFreeze.bind(wr);wr.setUseProxies.bind(wr);wr.applyPatches.bind(wr);wr.createDraft.bind(wr);wr.finishDraft.bind(wr);function nT(e){var t=function(r){var i=r.dispatch,o=r.getState;return function(s){return function(u){return typeof u=="function"?u(i,o,e):s(u)}}};return t}var rT=nT();rT.withExtraArgument=nT;const R2=rT;var W9=globalThis&&globalThis.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),U9=globalThis&&globalThis.__generator||function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,s;return s={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function u(f){return function(p){return c([f,p])}}function c(f){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,i&&(o=f[0]&2?i.return:f[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,f[1])).done)return o;switch(i=0,o&&(f=[f[0]&2,o.value]),f[0]){case 0:case 1:o=f;break;case 4:return n.label++,{value:f[1],done:!1};case 5:n.label++,i=f[1],f=[0];continue;case 7:f=n.ops.pop(),n.trys.pop();continue;default:if(o=n.trys,!(o=o.length>0&&o[o.length-1])&&(f[0]===6||f[0]===2)){n=0;continue}if(f[0]===3&&(!o||f[1]>o[0]&&f[1]-1;return n&&r}function ux(e){return typeof e[0]=="function"&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function oT(){for(var e=[],t=0;t(e.PLAYER="player",e.SHOP="shop",e.CONTAINER="container",e.CRAFTING="crafting",e))(Rn||{}),Vp={exports:{}};(function(e,t){(function(){var n,r="4.17.21",i=200,o="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",s="Expected a function",u="Invalid `variable` option passed into `_.template`",c="__lodash_hash_undefined__",f=500,p="__lodash_placeholder__",h=1,g=2,v=4,y=1,b=2,C=1,x=2,w=4,S=8,E=16,I=32,_=64,R=128,D=256,W=512,L=30,B="...",Y=800,Z=16,re=1,te=2,oe=3,le=1/0,H=9007199254740991,Q=17976931348623157e292,K=0/0,A=4294967295,M=A-1,we=A>>>1,xe=[["ary",R],["bind",C],["bindKey",x],["curry",S],["curryRight",E],["flip",W],["partial",I],["partialRight",_],["rearg",D]],Se="[object Arguments]",me="[object Array]",Ae="[object AsyncFunction]",Pe="[object Boolean]",de="[object Date]",We="[object DOMException]",Ie="[object Error]",qt="[object Function]",Yt="[object GeneratorFunction]",it="[object Map]",dt="[object Number]",kn="[object Null]",pt="[object Object]",ot="[object Promise]",Wn="[object Proxy]",Ze="[object RegExp]",Qe="[object Set]",Kt="[object String]",ln="[object Symbol]",Xt="[object Undefined]",ht="[object WeakMap]",Dt="[object WeakSet]",vt="[object ArrayBuffer]",V="[object DataView]",q="[object Float32Array]",be="[object Float64Array]",Ce="[object Int8Array]",ft="[object Int16Array]",nr="[object Int32Array]",Ke="[object Uint8Array]",St="[object Uint8ClampedArray]",rr="[object Uint16Array]",Or="[object Uint32Array]",kt=/\b__p \+= '';/g,ca=/\b(__p \+=) '' \+/g,ir=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ll=/&(?:amp|lt|gt|quot|#39);/g,Fl=/[&<>"']/g,uf=RegExp(Ll.source),cf=RegExp(Fl.source),ff=/<%-([\s\S]+?)%>/g,df=/<%([\s\S]+?)%>/g,pf=/<%=([\s\S]+?)%>/g,Cm=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Em=/^\w*$/,fa=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,da=/[\\^$.*+?()[\]{}|]/g,Om=RegExp(da.source),Di=/^\s+/,zl=/\s/,or=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,pa=/\{\n\/\* \[wrapped with (.+)\] \*/,_m=/,? & /,ha=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Bl=/[()=,{}\[\]\/\s]/,hf=/\\(\\)?/g,mf=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,jl=/\w*$/,gf=/^[-+]0x[0-9a-f]+$/i,Pm=/^0b[01]+$/i,Tm=/^\[object .+?Constructor\]$/,Im=/^0o[0-7]+$/i,Rm=/^(?:0|[1-9]\d*)$/,Ue=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,un=/($^)/,nM=/['\n\r\u2028\u2029\\]/g,vf="\\ud800-\\udfff",rM="\\u0300-\\u036f",iM="\\ufe20-\\ufe2f",oM="\\u20d0-\\u20ff",Ab=rM+iM+oM,Mb="\\u2700-\\u27bf",$b="a-z\\xdf-\\xf6\\xf8-\\xff",aM="\\xac\\xb1\\xd7\\xf7",sM="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",lM="\\u2000-\\u206f",uM=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Db="A-Z\\xc0-\\xd6\\xd8-\\xde",Nb="\\ufe0e\\ufe0f",Lb=aM+sM+lM+uM,Am="['’]",cM="["+vf+"]",Fb="["+Lb+"]",yf="["+Ab+"]",zb="\\d+",fM="["+Mb+"]",Bb="["+$b+"]",jb="[^"+vf+Lb+zb+Mb+$b+Db+"]",Mm="\\ud83c[\\udffb-\\udfff]",dM="(?:"+yf+"|"+Mm+")",Wb="[^"+vf+"]",$m="(?:\\ud83c[\\udde6-\\uddff]){2}",Dm="[\\ud800-\\udbff][\\udc00-\\udfff]",is="["+Db+"]",Ub="\\u200d",Hb="(?:"+Bb+"|"+jb+")",pM="(?:"+is+"|"+jb+")",Vb="(?:"+Am+"(?:d|ll|m|re|s|t|ve))?",Gb="(?:"+Am+"(?:D|LL|M|RE|S|T|VE))?",qb=dM+"?",Yb="["+Nb+"]?",hM="(?:"+Ub+"(?:"+[Wb,$m,Dm].join("|")+")"+Yb+qb+")*",mM="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gM="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Kb=Yb+qb+hM,vM="(?:"+[fM,$m,Dm].join("|")+")"+Kb,yM="(?:"+[Wb+yf+"?",yf,$m,Dm,cM].join("|")+")",xM=RegExp(Am,"g"),bM=RegExp(yf,"g"),Nm=RegExp(Mm+"(?="+Mm+")|"+yM+Kb,"g"),wM=RegExp([is+"?"+Bb+"+"+Vb+"(?="+[Fb,is,"$"].join("|")+")",pM+"+"+Gb+"(?="+[Fb,is+Hb,"$"].join("|")+")",is+"?"+Hb+"+"+Vb,is+"+"+Gb,gM,mM,zb,vM].join("|"),"g"),SM=RegExp("["+Ub+vf+Ab+Nb+"]"),kM=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,CM=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],EM=-1,Ct={};Ct[q]=Ct[be]=Ct[Ce]=Ct[ft]=Ct[nr]=Ct[Ke]=Ct[St]=Ct[rr]=Ct[Or]=!0,Ct[Se]=Ct[me]=Ct[vt]=Ct[Pe]=Ct[V]=Ct[de]=Ct[Ie]=Ct[qt]=Ct[it]=Ct[dt]=Ct[pt]=Ct[Ze]=Ct[Qe]=Ct[Kt]=Ct[ht]=!1;var yt={};yt[Se]=yt[me]=yt[vt]=yt[V]=yt[Pe]=yt[de]=yt[q]=yt[be]=yt[Ce]=yt[ft]=yt[nr]=yt[it]=yt[dt]=yt[pt]=yt[Ze]=yt[Qe]=yt[Kt]=yt[ln]=yt[Ke]=yt[St]=yt[rr]=yt[Or]=!0,yt[Ie]=yt[qt]=yt[ht]=!1;var OM={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"},_M={"&":"&","<":"<",">":">",'"':""","'":"'"},PM={"&":"&","<":"<",">":">",""":'"',"'":"'"},TM={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},IM=parseFloat,RM=parseInt,Xb=typeof ru=="object"&&ru&&ru.Object===Object&&ru,AM=typeof self=="object"&&self&&self.Object===Object&&self,hn=Xb||AM||Function("return this")(),Lm=t&&!t.nodeType&&t,ma=Lm&&!0&&e&&!e.nodeType&&e,Qb=ma&&ma.exports===Lm,Fm=Qb&&Xb.process,_r=function(){try{var j=ma&&ma.require&&ma.require("util").types;return j||Fm&&Fm.binding&&Fm.binding("util")}catch{}}(),Zb=_r&&_r.isArrayBuffer,Jb=_r&&_r.isDate,ew=_r&&_r.isMap,tw=_r&&_r.isRegExp,nw=_r&&_r.isSet,rw=_r&&_r.isTypedArray;function ar(j,X,G){switch(G.length){case 0:return j.call(X);case 1:return j.call(X,G[0]);case 2:return j.call(X,G[0],G[1]);case 3:return j.call(X,G[0],G[1],G[2])}return j.apply(X,G)}function MM(j,X,G,ce){for(var Re=-1,Je=j==null?0:j.length;++Re-1}function zm(j,X,G){for(var ce=-1,Re=j==null?0:j.length;++ce-1;);return G}function fw(j,X){for(var G=j.length;G--&&os(X,j[G],0)>-1;);return G}function WM(j,X){for(var G=j.length,ce=0;G--;)j[G]===X&&++ce;return ce}var UM=Um(OM),HM=Um(_M);function VM(j){return"\\"+TM[j]}function GM(j,X){return j==null?n:j[X]}function as(j){return SM.test(j)}function qM(j){return kM.test(j)}function YM(j){for(var X,G=[];!(X=j.next()).done;)G.push(X.value);return G}function qm(j){var X=-1,G=Array(j.size);return j.forEach(function(ce,Re){G[++X]=[Re,ce]}),G}function dw(j,X){return function(G){return j(X(G))}}function mo(j,X){for(var G=-1,ce=j.length,Re=0,Je=[];++G-1}function D5(a,l){var d=this.__data__,m=Nf(d,a);return m<0?(++this.size,d.push([a,l])):d[m][1]=l,this}Ni.prototype.clear=R5,Ni.prototype.delete=A5,Ni.prototype.get=M5,Ni.prototype.has=$5,Ni.prototype.set=D5;function Li(a){var l=-1,d=a==null?0:a.length;for(this.clear();++l=l?a:l)),a}function Rr(a,l,d,m,k,P){var $,F=l&h,U=l&g,J=l&v;if(d&&($=k?d(a,m,k,P):d(a)),$!==n)return $;if(!Nt(a))return a;var ee=Me(a);if(ee){if($=z$(a),!F)return Un(a,$)}else{var ne=En(a),ue=ne==qt||ne==Yt;if(wo(a))return Yw(a,F);if(ne==pt||ne==Se||ue&&!k){if($=U||ue?{}:pS(a),!F)return U?P$(a,Q5($,a)):_$(a,Cw($,a))}else{if(!yt[ne])return k?a:{};$=B$(a,ne,F)}}P||(P=new ti);var ve=P.get(a);if(ve)return ve;P.set(a,$),WS(a)?a.forEach(function(_e){$.add(Rr(_e,l,d,_e,a,P))}):BS(a)&&a.forEach(function(_e,He){$.set(He,Rr(_e,l,d,He,a,P))});var Oe=J?U?xg:yg:U?Vn:cn,ze=ee?n:Oe(a);return Pr(ze||a,function(_e,He){ze&&(He=_e,_e=a[He]),Yl($,He,Rr(_e,l,d,He,a,P))}),$}function Z5(a){var l=cn(a);return function(d){return Ew(d,a,l)}}function Ew(a,l,d){var m=d.length;if(a==null)return!m;for(a=mt(a);m--;){var k=d[m],P=l[k],$=a[k];if($===n&&!(k in a)||!P($))return!1}return!0}function Ow(a,l,d){if(typeof a!="function")throw new Tr(s);return tu(function(){a.apply(n,d)},l)}function Kl(a,l,d,m){var k=-1,P=xf,$=!0,F=a.length,U=[],J=l.length;if(!F)return U;d&&(l=Rt(l,sr(d))),m?(P=zm,$=!1):l.length>=i&&(P=Wl,$=!1,l=new ya(l));e:for(;++kk?0:k+d),m=m===n||m>k?k:Le(m),m<0&&(m+=k),m=d>m?0:HS(m);d0&&d(F)?l>1?mn(F,l-1,d,m,k):ho(k,F):m||(k[k.length]=F)}return k}var eg=eS(),Tw=eS(!0);function mi(a,l){return a&&eg(a,l,cn)}function tg(a,l){return a&&Tw(a,l,cn)}function Ff(a,l){return po(l,function(d){return Wi(a[d])})}function ba(a,l){l=xo(l,a);for(var d=0,m=l.length;a!=null&&dl}function t$(a,l){return a!=null&&at.call(a,l)}function n$(a,l){return a!=null&&l in mt(a)}function r$(a,l,d){return a>=Cn(l,d)&&a=120&&ee.length>=120)?new ya($&&ee):n}ee=a[0];var ne=-1,ue=F[0];e:for(;++ne-1;)F!==a&&Tf.call(F,U,1),Tf.call(a,U,1);return a}function Bw(a,l){for(var d=a?l.length:0,m=d-1;d--;){var k=l[d];if(d==m||k!==P){var P=k;ji(k)?Tf.call(a,k,1):fg(a,k)}}return a}function lg(a,l){return a+Af(bw()*(l-a+1))}function g$(a,l,d,m){for(var k=-1,P=nn(Rf((l-a)/(d||1)),0),$=G(P);P--;)$[m?P:++k]=a,a+=d;return $}function ug(a,l){var d="";if(!a||l<1||l>H)return d;do l%2&&(d+=a),l=Af(l/2),l&&(a+=a);while(l);return d}function je(a,l){return Og(gS(a,l,Gn),a+"")}function v$(a){return kw(vs(a))}function y$(a,l){var d=vs(a);return Kf(d,xa(l,0,d.length))}function Zl(a,l,d,m){if(!Nt(a))return a;l=xo(l,a);for(var k=-1,P=l.length,$=P-1,F=a;F!=null&&++kk?0:k+l),d=d>k?k:d,d<0&&(d+=k),k=l>d?0:d-l>>>0,l>>>=0;for(var P=G(k);++m>>1,$=a[P];$!==null&&!ur($)&&(d?$<=l:$=i){var J=l?null:A$(a);if(J)return wf(J);$=!1,k=Wl,U=new ya}else U=l?[]:F;e:for(;++m=m?a:Ar(a,l,d)}var qw=u5||function(a){return hn.clearTimeout(a)};function Yw(a,l){if(l)return a.slice();var d=a.length,m=mw?mw(d):new a.constructor(d);return a.copy(m),m}function mg(a){var l=new a.constructor(a.byteLength);return new _f(l).set(new _f(a)),l}function k$(a,l){var d=l?mg(a.buffer):a.buffer;return new a.constructor(d,a.byteOffset,a.byteLength)}function C$(a){var l=new a.constructor(a.source,jl.exec(a));return l.lastIndex=a.lastIndex,l}function E$(a){return ql?mt(ql.call(a)):{}}function Kw(a,l){var d=l?mg(a.buffer):a.buffer;return new a.constructor(d,a.byteOffset,a.length)}function Xw(a,l){if(a!==l){var d=a!==n,m=a===null,k=a===a,P=ur(a),$=l!==n,F=l===null,U=l===l,J=ur(l);if(!F&&!J&&!P&&a>l||P&&$&&U&&!F&&!J||m&&$&&U||!d&&U||!k)return 1;if(!m&&!P&&!J&&a=F)return U;var J=d[m];return U*(J=="desc"?-1:1)}}return a.index-l.index}function Qw(a,l,d,m){for(var k=-1,P=a.length,$=d.length,F=-1,U=l.length,J=nn(P-$,0),ee=G(U+J),ne=!m;++F1?d[k-1]:n,$=k>2?d[2]:n;for(P=a.length>3&&typeof P=="function"?(k--,P):n,$&&Dn(d[0],d[1],$)&&(P=k<3?n:P,k=1),l=mt(l);++m-1?k[P?l[$]:$]:n}}function rS(a){return Bi(function(l){var d=l.length,m=d,k=Ir.prototype.thru;for(a&&l.reverse();m--;){var P=l[m];if(typeof P!="function")throw new Tr(s);if(k&&!$&&qf(P)=="wrapper")var $=new Ir([],!0)}for(m=$?m:d;++m1&&qe.reverse(),ee&&UF))return!1;var J=P.get(a),ee=P.get(l);if(J&&ee)return J==l&&ee==a;var ne=-1,ue=!0,ve=d&b?new ya:n;for(P.set(a,l),P.set(l,a);++ne1?"& ":"")+l[m],l=l.join(d>2?", ":" "),a.replace(or,`{ -/* [wrapped with `+l+`] */ -`)}function W$(a){return Me(a)||ka(a)||!!(yw&&a&&a[yw])}function ji(a,l){var d=typeof a;return l=l??H,!!l&&(d=="number"||d!="symbol"&&Rm.test(a))&&a>-1&&a%1==0&&a0){if(++l>=Y)return arguments[0]}else l=0;return a.apply(n,arguments)}}function Kf(a,l){var d=-1,m=a.length,k=m-1;for(l=l===n?m:l;++d1?a[l-1]:n;return d=typeof d=="function"?(a.pop(),d):n,PS(a,d)});function TS(a){var l=O(a);return l.__chain__=!0,l}function J4(a,l){return l(a),a}function Xf(a,l){return l(a)}var e3=Bi(function(a){var l=a.length,d=l?a[0]:0,m=this.__wrapped__,k=function(P){return Jm(P,a)};return l>1||this.__actions__.length||!(m instanceof Ve)||!ji(d)?this.thru(k):(m=m.slice(d,+d+(l?1:0)),m.__actions__.push({func:Xf,args:[k],thisArg:n}),new Ir(m,this.__chain__).thru(function(P){return l&&!P.length&&P.push(n),P}))});function t3(){return TS(this)}function n3(){return new Ir(this.value(),this.__chain__)}function r3(){this.__values__===n&&(this.__values__=US(this.value()));var a=this.__index__>=this.__values__.length,l=a?n:this.__values__[this.__index__++];return{done:a,value:l}}function i3(){return this}function o3(a){for(var l,d=this;d instanceof Df;){var m=SS(d);m.__index__=0,m.__values__=n,l?k.__wrapped__=m:l=m;var k=m;d=d.__wrapped__}return k.__wrapped__=a,l}function a3(){var a=this.__wrapped__;if(a instanceof Ve){var l=a;return this.__actions__.length&&(l=new Ve(this)),l=l.reverse(),l.__actions__.push({func:Xf,args:[_g],thisArg:n}),new Ir(l,this.__chain__)}return this.thru(_g)}function s3(){return Vw(this.__wrapped__,this.__actions__)}var l3=Wf(function(a,l,d){at.call(a,d)?++a[d]:Fi(a,d,1)});function u3(a,l,d){var m=Me(a)?iw:J5;return d&&Dn(a,l,d)&&(l=n),m(a,Ee(l,3))}function c3(a,l){var d=Me(a)?po:Pw;return d(a,Ee(l,3))}var f3=nS(kS),d3=nS(CS);function p3(a,l){return mn(Qf(a,l),1)}function h3(a,l){return mn(Qf(a,l),le)}function m3(a,l,d){return d=d===n?1:Le(d),mn(Qf(a,l),d)}function IS(a,l){var d=Me(a)?Pr:vo;return d(a,Ee(l,3))}function RS(a,l){var d=Me(a)?$M:_w;return d(a,Ee(l,3))}var g3=Wf(function(a,l,d){at.call(a,d)?a[d].push(l):Fi(a,d,[l])});function v3(a,l,d,m){a=Hn(a)?a:vs(a),d=d&&!m?Le(d):0;var k=a.length;return d<0&&(d=nn(k+d,0)),nd(a)?d<=k&&a.indexOf(l,d)>-1:!!k&&os(a,l,d)>-1}var y3=je(function(a,l,d){var m=-1,k=typeof l=="function",P=Hn(a)?G(a.length):[];return vo(a,function($){P[++m]=k?ar(l,$,d):Xl($,l,d)}),P}),x3=Wf(function(a,l,d){Fi(a,d,l)});function Qf(a,l){var d=Me(a)?Rt:$w;return d(a,Ee(l,3))}function b3(a,l,d,m){return a==null?[]:(Me(l)||(l=l==null?[]:[l]),d=m?n:d,Me(d)||(d=d==null?[]:[d]),Fw(a,l,d))}var w3=Wf(function(a,l,d){a[d?0:1].push(l)},function(){return[[],[]]});function S3(a,l,d){var m=Me(a)?Bm:lw,k=arguments.length<3;return m(a,Ee(l,4),d,k,vo)}function k3(a,l,d){var m=Me(a)?DM:lw,k=arguments.length<3;return m(a,Ee(l,4),d,k,_w)}function C3(a,l){var d=Me(a)?po:Pw;return d(a,ed(Ee(l,3)))}function E3(a){var l=Me(a)?kw:v$;return l(a)}function O3(a,l,d){(d?Dn(a,l,d):l===n)?l=1:l=Le(l);var m=Me(a)?Y5:y$;return m(a,l)}function _3(a){var l=Me(a)?K5:b$;return l(a)}function P3(a){if(a==null)return 0;if(Hn(a))return nd(a)?ss(a):a.length;var l=En(a);return l==it||l==Qe?a.size:og(a).length}function T3(a,l,d){var m=Me(a)?jm:w$;return d&&Dn(a,l,d)&&(l=n),m(a,Ee(l,3))}var I3=je(function(a,l){if(a==null)return[];var d=l.length;return d>1&&Dn(a,l[0],l[1])?l=[]:d>2&&Dn(l[0],l[1],l[2])&&(l=[l[0]]),Fw(a,mn(l,1),[])}),Zf=c5||function(){return hn.Date.now()};function R3(a,l){if(typeof l!="function")throw new Tr(s);return a=Le(a),function(){if(--a<1)return l.apply(this,arguments)}}function AS(a,l,d){return l=d?n:l,l=a&&l==null?a.length:l,zi(a,R,n,n,n,n,l)}function MS(a,l){var d;if(typeof l!="function")throw new Tr(s);return a=Le(a),function(){return--a>0&&(d=l.apply(this,arguments)),a<=1&&(l=n),d}}var Tg=je(function(a,l,d){var m=C;if(d.length){var k=mo(d,ms(Tg));m|=I}return zi(a,m,l,d,k)}),$S=je(function(a,l,d){var m=C|x;if(d.length){var k=mo(d,ms($S));m|=I}return zi(l,m,a,d,k)});function DS(a,l,d){l=d?n:l;var m=zi(a,S,n,n,n,n,n,l);return m.placeholder=DS.placeholder,m}function NS(a,l,d){l=d?n:l;var m=zi(a,E,n,n,n,n,n,l);return m.placeholder=NS.placeholder,m}function LS(a,l,d){var m,k,P,$,F,U,J=0,ee=!1,ne=!1,ue=!0;if(typeof a!="function")throw new Tr(s);l=$r(l)||0,Nt(d)&&(ee=!!d.leading,ne="maxWait"in d,P=ne?nn($r(d.maxWait)||0,l):P,ue="trailing"in d?!!d.trailing:ue);function ve(Vt){var ri=m,Hi=k;return m=k=n,J=Vt,$=a.apply(Hi,ri),$}function Oe(Vt){return J=Vt,F=tu(He,l),ee?ve(Vt):$}function ze(Vt){var ri=Vt-U,Hi=Vt-J,nk=l-ri;return ne?Cn(nk,P-Hi):nk}function _e(Vt){var ri=Vt-U,Hi=Vt-J;return U===n||ri>=l||ri<0||ne&&Hi>=P}function He(){var Vt=Zf();if(_e(Vt))return qe(Vt);F=tu(He,ze(Vt))}function qe(Vt){return F=n,ue&&m?ve(Vt):(m=k=n,$)}function cr(){F!==n&&qw(F),J=0,m=U=k=F=n}function Nn(){return F===n?$:qe(Zf())}function fr(){var Vt=Zf(),ri=_e(Vt);if(m=arguments,k=this,U=Vt,ri){if(F===n)return Oe(U);if(ne)return qw(F),F=tu(He,l),ve(U)}return F===n&&(F=tu(He,l)),$}return fr.cancel=cr,fr.flush=Nn,fr}var A3=je(function(a,l){return Ow(a,1,l)}),M3=je(function(a,l,d){return Ow(a,$r(l)||0,d)});function $3(a){return zi(a,W)}function Jf(a,l){if(typeof a!="function"||l!=null&&typeof l!="function")throw new Tr(s);var d=function(){var m=arguments,k=l?l.apply(this,m):m[0],P=d.cache;if(P.has(k))return P.get(k);var $=a.apply(this,m);return d.cache=P.set(k,$)||P,$};return d.cache=new(Jf.Cache||Li),d}Jf.Cache=Li;function ed(a){if(typeof a!="function")throw new Tr(s);return function(){var l=arguments;switch(l.length){case 0:return!a.call(this);case 1:return!a.call(this,l[0]);case 2:return!a.call(this,l[0],l[1]);case 3:return!a.call(this,l[0],l[1],l[2])}return!a.apply(this,l)}}function D3(a){return MS(2,a)}var N3=S$(function(a,l){l=l.length==1&&Me(l[0])?Rt(l[0],sr(Ee())):Rt(mn(l,1),sr(Ee()));var d=l.length;return je(function(m){for(var k=-1,P=Cn(m.length,d);++k=l}),ka=Rw(function(){return arguments}())?Rw:function(a){return jt(a)&&at.call(a,"callee")&&!vw.call(a,"callee")},Me=G.isArray,Q3=Zb?sr(Zb):o$;function Hn(a){return a!=null&&td(a.length)&&!Wi(a)}function Ht(a){return jt(a)&&Hn(a)}function Z3(a){return a===!0||a===!1||jt(a)&&$n(a)==Pe}var wo=d5||jg,J3=Jb?sr(Jb):a$;function eD(a){return jt(a)&&a.nodeType===1&&!nu(a)}function tD(a){if(a==null)return!0;if(Hn(a)&&(Me(a)||typeof a=="string"||typeof a.splice=="function"||wo(a)||gs(a)||ka(a)))return!a.length;var l=En(a);if(l==it||l==Qe)return!a.size;if(eu(a))return!og(a).length;for(var d in a)if(at.call(a,d))return!1;return!0}function nD(a,l){return Ql(a,l)}function rD(a,l,d){d=typeof d=="function"?d:n;var m=d?d(a,l):n;return m===n?Ql(a,l,n,d):!!m}function Rg(a){if(!jt(a))return!1;var l=$n(a);return l==Ie||l==We||typeof a.message=="string"&&typeof a.name=="string"&&!nu(a)}function iD(a){return typeof a=="number"&&xw(a)}function Wi(a){if(!Nt(a))return!1;var l=$n(a);return l==qt||l==Yt||l==Ae||l==Wn}function zS(a){return typeof a=="number"&&a==Le(a)}function td(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=H}function Nt(a){var l=typeof a;return a!=null&&(l=="object"||l=="function")}function jt(a){return a!=null&&typeof a=="object"}var BS=ew?sr(ew):l$;function oD(a,l){return a===l||ig(a,l,wg(l))}function aD(a,l,d){return d=typeof d=="function"?d:n,ig(a,l,wg(l),d)}function sD(a){return jS(a)&&a!=+a}function lD(a){if(V$(a))throw new Re(o);return Aw(a)}function uD(a){return a===null}function cD(a){return a==null}function jS(a){return typeof a=="number"||jt(a)&&$n(a)==dt}function nu(a){if(!jt(a)||$n(a)!=pt)return!1;var l=Pf(a);if(l===null)return!0;var d=at.call(l,"constructor")&&l.constructor;return typeof d=="function"&&d instanceof d&&Cf.call(d)==a5}var Ag=tw?sr(tw):u$;function fD(a){return zS(a)&&a>=-H&&a<=H}var WS=nw?sr(nw):c$;function nd(a){return typeof a=="string"||!Me(a)&&jt(a)&&$n(a)==Kt}function ur(a){return typeof a=="symbol"||jt(a)&&$n(a)==ln}var gs=rw?sr(rw):f$;function dD(a){return a===n}function pD(a){return jt(a)&&En(a)==ht}function hD(a){return jt(a)&&$n(a)==Dt}var mD=Gf(ag),gD=Gf(function(a,l){return a<=l});function US(a){if(!a)return[];if(Hn(a))return nd(a)?ei(a):Un(a);if(Ul&&a[Ul])return YM(a[Ul]());var l=En(a),d=l==it?qm:l==Qe?wf:vs;return d(a)}function Ui(a){if(!a)return a===0?a:0;if(a=$r(a),a===le||a===-le){var l=a<0?-1:1;return l*Q}return a===a?a:0}function Le(a){var l=Ui(a),d=l%1;return l===l?d?l-d:l:0}function HS(a){return a?xa(Le(a),0,A):0}function $r(a){if(typeof a=="number")return a;if(ur(a))return K;if(Nt(a)){var l=typeof a.valueOf=="function"?a.valueOf():a;a=Nt(l)?l+"":l}if(typeof a!="string")return a===0?a:+a;a=uw(a);var d=Pm.test(a);return d||Im.test(a)?RM(a.slice(2),d?2:8):gf.test(a)?K:+a}function VS(a){return gi(a,Vn(a))}function vD(a){return a?xa(Le(a),-H,H):a===0?a:0}function nt(a){return a==null?"":lr(a)}var yD=ps(function(a,l){if(eu(l)||Hn(l)){gi(l,cn(l),a);return}for(var d in l)at.call(l,d)&&Yl(a,d,l[d])}),GS=ps(function(a,l){gi(l,Vn(l),a)}),rd=ps(function(a,l,d,m){gi(l,Vn(l),a,m)}),xD=ps(function(a,l,d,m){gi(l,cn(l),a,m)}),bD=Bi(Jm);function wD(a,l){var d=ds(a);return l==null?d:Cw(d,l)}var SD=je(function(a,l){a=mt(a);var d=-1,m=l.length,k=m>2?l[2]:n;for(k&&Dn(l[0],l[1],k)&&(m=1);++d1),P}),gi(a,xg(a),d),m&&(d=Rr(d,h|g|v,M$));for(var k=l.length;k--;)fg(d,l[k]);return d});function BD(a,l){return YS(a,ed(Ee(l)))}var jD=Bi(function(a,l){return a==null?{}:h$(a,l)});function YS(a,l){if(a==null)return{};var d=Rt(xg(a),function(m){return[m]});return l=Ee(l),zw(a,d,function(m,k){return l(m,k[0])})}function WD(a,l,d){l=xo(l,a);var m=-1,k=l.length;for(k||(k=1,a=n);++ml){var m=a;a=l,l=m}if(d||a%1||l%1){var k=bw();return Cn(a+k*(l-a+IM("1e-"+((k+"").length-1))),l)}return lg(a,l)}var JD=hs(function(a,l,d){return l=l.toLowerCase(),a+(d?QS(l):l)});function QS(a){return Dg(nt(a).toLowerCase())}function ZS(a){return a=nt(a),a&&a.replace(Ue,UM).replace(bM,"")}function eN(a,l,d){a=nt(a),l=lr(l);var m=a.length;d=d===n?m:xa(Le(d),0,m);var k=d;return d-=l.length,d>=0&&a.slice(d,k)==l}function tN(a){return a=nt(a),a&&cf.test(a)?a.replace(Fl,HM):a}function nN(a){return a=nt(a),a&&Om.test(a)?a.replace(da,"\\$&"):a}var rN=hs(function(a,l,d){return a+(d?"-":"")+l.toLowerCase()}),iN=hs(function(a,l,d){return a+(d?" ":"")+l.toLowerCase()}),oN=tS("toLowerCase");function aN(a,l,d){a=nt(a),l=Le(l);var m=l?ss(a):0;if(!l||m>=l)return a;var k=(l-m)/2;return Vf(Af(k),d)+a+Vf(Rf(k),d)}function sN(a,l,d){a=nt(a),l=Le(l);var m=l?ss(a):0;return l&&m>>0,d?(a=nt(a),a&&(typeof l=="string"||l!=null&&!Ag(l))&&(l=lr(l),!l&&as(a))?bo(ei(a),0,d):a.split(l,d)):[]}var hN=hs(function(a,l,d){return a+(d?" ":"")+Dg(l)});function mN(a,l,d){return a=nt(a),d=d==null?0:xa(Le(d),0,a.length),l=lr(l),a.slice(d,d+l.length)==l}function gN(a,l,d){var m=O.templateSettings;d&&Dn(a,l,d)&&(l=n),a=nt(a),l=rd({},l,m,lS);var k=rd({},l.imports,m.imports,lS),P=cn(k),$=Gm(k,P),F,U,J=0,ee=l.interpolate||un,ne="__p += '",ue=Ym((l.escape||un).source+"|"+ee.source+"|"+(ee===pf?mf:un).source+"|"+(l.evaluate||un).source+"|$","g"),ve="//# sourceURL="+(at.call(l,"sourceURL")?(l.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++EM+"]")+` -`;a.replace(ue,function(_e,He,qe,cr,Nn,fr){return qe||(qe=cr),ne+=a.slice(J,fr).replace(nM,VM),He&&(F=!0,ne+=`' + -__e(`+He+`) + -'`),Nn&&(U=!0,ne+=`'; -`+Nn+`; -__p += '`),qe&&(ne+=`' + -((__t = (`+qe+`)) == null ? '' : __t) + -'`),J=fr+_e.length,_e}),ne+=`'; -`;var Oe=at.call(l,"variable")&&l.variable;if(!Oe)ne=`with (obj) { -`+ne+` -} -`;else if(Bl.test(Oe))throw new Re(u);ne=(U?ne.replace(kt,""):ne).replace(ca,"$1").replace(ir,"$1;"),ne="function("+(Oe||"obj")+`) { -`+(Oe?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(F?", __e = _.escape":"")+(U?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+ne+`return __p -}`;var ze=ek(function(){return Je(P,ve+"return "+ne).apply(n,$)});if(ze.source=ne,Rg(ze))throw ze;return ze}function vN(a){return nt(a).toLowerCase()}function yN(a){return nt(a).toUpperCase()}function xN(a,l,d){if(a=nt(a),a&&(d||l===n))return uw(a);if(!a||!(l=lr(l)))return a;var m=ei(a),k=ei(l),P=cw(m,k),$=fw(m,k)+1;return bo(m,P,$).join("")}function bN(a,l,d){if(a=nt(a),a&&(d||l===n))return a.slice(0,pw(a)+1);if(!a||!(l=lr(l)))return a;var m=ei(a),k=fw(m,ei(l))+1;return bo(m,0,k).join("")}function wN(a,l,d){if(a=nt(a),a&&(d||l===n))return a.replace(Di,"");if(!a||!(l=lr(l)))return a;var m=ei(a),k=cw(m,ei(l));return bo(m,k).join("")}function SN(a,l){var d=L,m=B;if(Nt(l)){var k="separator"in l?l.separator:k;d="length"in l?Le(l.length):d,m="omission"in l?lr(l.omission):m}a=nt(a);var P=a.length;if(as(a)){var $=ei(a);P=$.length}if(d>=P)return a;var F=d-ss(m);if(F<1)return m;var U=$?bo($,0,F).join(""):a.slice(0,F);if(k===n)return U+m;if($&&(F+=U.length-F),Ag(k)){if(a.slice(F).search(k)){var J,ee=U;for(k.global||(k=Ym(k.source,nt(jl.exec(k))+"g")),k.lastIndex=0;J=k.exec(ee);)var ne=J.index;U=U.slice(0,ne===n?F:ne)}}else if(a.indexOf(lr(k),F)!=F){var ue=U.lastIndexOf(k);ue>-1&&(U=U.slice(0,ue))}return U+m}function kN(a){return a=nt(a),a&&uf.test(a)?a.replace(Ll,ZM):a}var CN=hs(function(a,l,d){return a+(d?" ":"")+l.toUpperCase()}),Dg=tS("toUpperCase");function JS(a,l,d){return a=nt(a),l=d?n:l,l===n?qM(a)?t5(a):FM(a):a.match(l)||[]}var ek=je(function(a,l){try{return ar(a,n,l)}catch(d){return Rg(d)?d:new Re(d)}}),EN=Bi(function(a,l){return Pr(l,function(d){d=vi(d),Fi(a,d,Tg(a[d],a))}),a});function ON(a){var l=a==null?0:a.length,d=Ee();return a=l?Rt(a,function(m){if(typeof m[1]!="function")throw new Tr(s);return[d(m[0]),m[1]]}):[],je(function(m){for(var k=-1;++kH)return[];var d=A,m=Cn(a,A);l=Ee(l),a-=A;for(var k=Vm(m,l);++d0||l<0)?new Ve(d):(a<0?d=d.takeRight(-a):a&&(d=d.drop(a)),l!==n&&(l=Le(l),d=l<0?d.dropRight(-l):d.take(l-a)),d)},Ve.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},Ve.prototype.toArray=function(){return this.take(A)},mi(Ve.prototype,function(a,l){var d=/^(?:filter|find|map|reject)|While$/.test(l),m=/^(?:head|last)$/.test(l),k=O[m?"take"+(l=="last"?"Right":""):l],P=m||/^find/.test(l);!k||(O.prototype[l]=function(){var $=this.__wrapped__,F=m?[1]:arguments,U=$ instanceof Ve,J=F[0],ee=U||Me($),ne=function(He){var qe=k.apply(O,ho([He],F));return m&&ue?qe[0]:qe};ee&&d&&typeof J=="function"&&J.length!=1&&(U=ee=!1);var ue=this.__chain__,ve=!!this.__actions__.length,Oe=P&&!ue,ze=U&&!ve;if(!P&&ee){$=ze?$:new Ve(this);var _e=a.apply($,F);return _e.__actions__.push({func:Xf,args:[ne],thisArg:n}),new Ir(_e,ue)}return Oe&&ze?a.apply(this,F):(_e=this.thru(ne),Oe?m?_e.value()[0]:_e.value():_e)})}),Pr(["pop","push","shift","sort","splice","unshift"],function(a){var l=Sf[a],d=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",m=/^(?:pop|shift)$/.test(a);O.prototype[a]=function(){var k=arguments;if(m&&!this.__chain__){var P=this.value();return l.apply(Me(P)?P:[],k)}return this[d](function($){return l.apply(Me($)?$:[],k)})}}),mi(Ve.prototype,function(a,l){var d=O[l];if(d){var m=d.name+"";at.call(fs,m)||(fs[m]=[]),fs[m].push({name:l,func:d})}}),fs[Uf(n,x).name]=[{name:"wrapper",func:n}],Ve.prototype.clone=k5,Ve.prototype.reverse=C5,Ve.prototype.value=E5,O.prototype.at=e3,O.prototype.chain=t3,O.prototype.commit=n3,O.prototype.next=r3,O.prototype.plant=o3,O.prototype.reverse=a3,O.prototype.toJSON=O.prototype.valueOf=O.prototype.value=s3,O.prototype.first=O.prototype.head,Ul&&(O.prototype[Ul]=i3),O},ls=n5();ma?((ma.exports=ls)._=ls,Lm._=ls):hn._=ls}).call(ru)})(Vp,Vp.exports);const xt={water:{name:"water",close:!1,label:"VODA",stack:!0,usable:!0,count:0},burger:{name:"burger",close:!1,label:"BURGR",stack:!1,usable:!1,count:0}};let tp="images";function g7(e){e&&e!==""&&(tp=e)}const lT=()=>!window.invokeNative,uT=()=>{},v7=window.GetParentResourceName?window.GetParentResourceName():"ox_inventory";async function Wr(e,t){if(!lT())try{return await(await fetch(`https://${v7}/${e}`,{method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(t)})).json()}catch(n){throw Error(`Failed to fetch NUI callback ${e}! (${n})`)}}const N2=(e,t)=>{if(t.type!=="shop"||!Fn(e))return!0;if(e.count!==void 0&&e.count===0)return!1;if(e.grade===void 0||!t.groups)return!0;const n=hr.getState().inventory.leftInventory;if(!n.groups)return!1;const r=Object.keys(t.groups);if(Array.isArray(e.grade)){for(let i=0;i=e.grade)return!0}return!1}},L2=(e,t)=>{if(!Fn(e)||t!=="crafting"||!e.ingredients)return!0;const n=hr.getState().inventory.leftInventory;return Object.entries(e.ingredients).filter(o=>{const[s,u]=[o[0],o[1]];return u>=1&&xt[s]&&xt[s].count>=u?!1:!n.items.find(f=>{if(Fn(f)&&f.name===s&&u<1)return f.metadata?.durability>=u*100})}).length===0},Fn=(e,t=!1)=>e.name!==void 0&&e.weight!==void 0||t&&e.name!==void 0&&e.count!==void 0&&e.weight!==void 0,y7=(e,t)=>e.name===t.name&&Vp.exports.isEqual(e.metadata,t.metadata),x7=(e,t,n)=>t.stack?n.find(i=>i.name===e.name&&Vp.exports.isEqual(i.metadata,e.metadata))||n.find(i=>i.name===void 0):n.find(i=>i.name===void 0),Yh=(e,t,n)=>({sourceInventory:t===Rn.PLAYER?e.leftInventory:e.rightInventory,targetInventory:n?n===Rn.PLAYER?e.leftInventory:e.rightInventory:t===Rn.PLAYER?e.rightInventory:e.leftInventory}),pl=(e,t)=>{if(e?.durability===void 0)return;let n=e.durability;return n>100&&e.degrade&&(n=(e.durability-t)/(60*e.degrade)*100),n<0&&(n=0),n},b7=e=>e.reduce((t,n)=>Fn(n)?t+n.weight:t,0),F2=async e=>{const t=await Wr("getItemData",e);if(t?.name)return xt[e]=t,t},Js=e=>{const t=typeof e=="object";if(t){if(!e.name)return;const i=e.metadata;if(i?.imageurl)return`${i.imageurl}`;if(i?.image)return`${tp}/${i.image}.png`}const n=t?e.name:e,r=xt[n];return r?(r.image||(r.image=`${tp}/${n}.png`),r.image):`${tp}/${n}.png`},w7=(e,t)=>{const{leftInventory:n,rightInventory:r}=t.payload,i=Math.floor(Date.now()/1e3);n&&(e.leftInventory={...n,items:Array.from(Array(n.slots),(o,s)=>{const u=Object.values(n.items).find(c=>c?.slot===s+1)||{slot:s+1};return u.name&&(typeof xt[u.name]>"u"&&F2(u.name),u.durability=pl(u.metadata,i)),u})}),r&&(e.rightInventory={...r,items:Array.from(Array(r.slots),(o,s)=>{const u=Object.values(r.items).find(c=>c?.slot===s+1)||{slot:s+1};return u.name&&(typeof xt[u.name]>"u"&&F2(u.name),u.durability=pl(u.metadata,i)),u})}),r?.type==="admin"?e.isBusy=!0:e.isBusy=!1},S7=(e,t)=>{if(t.payload.items){Array.isArray(t.payload.items)||(t.payload.items=[t.payload.items]);const n=Math.floor(Date.now()/1e3);Object.values(t.payload.items).filter(r=>!!r).forEach(r=>{const i=r.inventory&&r.inventory!==Rn.PLAYER?e.rightInventory:e.leftInventory;r.item.durability=pl(r.item.metadata,n),i.items[r.item.slot-1]=r.item}),e.rightInventory.type===Rn.CRAFTING&&(e.rightInventory={...e.rightInventory})}if(t.payload.itemCount){const n=Object.entries(t.payload.itemCount);for(let r=0;r{const{fromSlot:n,fromType:r,toSlot:i,toType:o}=t.payload,{sourceInventory:s,targetInventory:u}=Yh(e,r,o),c=Math.floor(Date.now()/1e3);[s.items[n.slot-1],u.items[i.slot-1]]=[{...u.items[i.slot-1],slot:n.slot,durability:pl(i.metadata,c)},{...s.items[n.slot-1],slot:i.slot,durability:pl(n.metadata,c)}]},C7=(e,t)=>{const{fromSlot:n,fromType:r,toSlot:i,toType:o,count:s}=t.payload,{sourceInventory:u,targetInventory:c}=Yh(e,r,o),f=n.weight/n.count;c.items[i.slot-1]={...c.items[i.slot-1],count:i.count+s,weight:f*(i.count+s)},!(r===Rn.SHOP||r===Rn.CRAFTING)&&(u.items[n.slot-1]=n.count-s>0?{...u.items[n.slot-1],count:n.count-s,weight:f*(n.count-s)}:{slot:n.slot})},E7=(e,t)=>{const{fromSlot:n,fromType:r,toSlot:i,toType:o,count:s}=t.payload,{sourceInventory:u,targetInventory:c}=Yh(e,r,o),f=n.weight/n.count,p=Math.floor(Date.now()/1e3),h=u.items[n.slot-1];c.items[i.slot-1]={...h,count:s,weight:f*s,slot:i.slot,durability:pl(h.metadata,p)},!(r===Rn.SHOP||r===Rn.CRAFTING)&&(u.items[n.slot-1]=n.count-s>0?{...u.items[n.slot-1],count:n.count-s,weight:f*(n.count-s)}:{slot:n.slot})},O7={leftInventory:{id:"",type:"",slots:0,maxWeight:0,items:[]},rightInventory:{id:"",type:"",slots:0,maxWeight:0,items:[]},additionalMetadata:{},contextMenu:{coords:null},itemAmount:0,shiftPressed:!1,isBusy:!1},cT=s7({name:"inventory",initialState:O7,reducers:{stackSlots:C7,swapSlots:k7,setupInventory:w7,moveSlots:E7,refreshSlots:S7,setContextMenu:(e,t)=>{e.contextMenu=t.payload},setAdditionalMetadata:(e,t)=>{e.additionalMetadata={...e.additionalMetadata,...t.payload}},setItemAmount:(e,t)=>{e.itemAmount=t.payload},setShiftPressed:(e,t)=>{e.shiftPressed=t.payload},setContainerWeight:(e,t)=>{const n=e.leftInventory.items.find(r=>r.metadata?.container===e.rightInventory.id);!n||(n.weight=t.payload)}},extraReducers:e=>{e.addMatcher(oT,t=>{t.isBusy=!0,t.history={leftInventory:ey(t.leftInventory),rightInventory:ey(t.rightInventory)}}),e.addMatcher(sT,t=>{t.isBusy=!1}),e.addMatcher(aT,t=>{t.history&&t.history.leftInventory&&t.history.rightInventory&&(t.leftInventory=t.history.leftInventory,t.rightInventory=t.history.rightInventory),t.isBusy=!1})}}),{setAdditionalMetadata:_7,setContextMenu:Gp,setItemAmount:P7,setShiftPressed:T7,setupInventory:fT,swapSlots:I7,moveSlots:R7,stackSlots:A7,refreshSlots:M7,setContainerWeight:$7}=cT.actions,dT=e=>e.inventory.leftInventory,D7=e=>e.inventory.rightInventory,N7=e=>e.inventory.itemAmount,L7=e=>e.inventory.isBusy,F7=cT.reducer,hr=r7({reducer:{inventory:F7}}),_l=()=>kz(),Ja=iz,z7={black:"#000",white:"#fff"},_c=z7,B7={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},bs=B7,j7={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},ws=j7,W7={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},Ss=W7,U7={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},ks=U7,H7={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},Cs=H7,V7={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},pu=V7,G7={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},q7=G7;function pT(e){var t=Object.create(null);return function(n){return t[n]===void 0&&(t[n]=e(n)),t[n]}}var Y7=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,K7=pT(function(e){return Y7.test(e)||e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)<91});function X7(e){if(e.sheet)return e.sheet;for(var t=0;t0?vn(Pl,--tr):0,hl--,Zt===10&&(hl=1,Xh--),Zt}function yr(){return Zt=tr2||Tc(Zt)>3?"":" "}function lB(e,t){for(;--t&&yr()&&!(Zt<48||Zt>102||Zt>57&&Zt<65||Zt>70&&Zt<97););return Hc(e,np()+(t<6&&Ii()==32&&yr()==32))}function iy(e){for(;yr();)switch(Zt){case e:return tr;case 34:case 39:e!==34&&e!==39&&iy(Zt);break;case 40:e===41&&iy(e);break;case 92:yr();break}return tr}function uB(e,t){for(;yr()&&e+Zt!==47+10;)if(e+Zt===42+42&&Ii()===47)break;return"/*"+Hc(t,tr-1)+"*"+Kh(e===47?e:yr())}function cB(e){for(;!Tc(Ii());)yr();return Hc(e,tr)}function fB(e){return xT(ip("",null,null,null,[""],e=yT(e),0,[0],e))}function ip(e,t,n,r,i,o,s,u,c){for(var f=0,p=0,h=s,g=0,v=0,y=0,b=1,C=1,x=1,w=0,S="",E=i,I=o,_=r,R=S;C;)switch(y=w,w=yr()){case 40:if(y!=108&&vn(R,h-1)==58){ry(R+=rt(rp(w),"&","&\f"),"&\f")!=-1&&(x=-1);break}case 34:case 39:case 91:R+=rp(w);break;case 9:case 10:case 13:case 32:R+=sB(y);break;case 92:R+=lB(np()-1,7);continue;case 47:switch(Ii()){case 42:case 47:Sd(dB(uB(yr(),np()),t,n),c);break;default:R+="/"}break;case 123*b:u[f++]=wi(R)*x;case 125*b:case 59:case 0:switch(w){case 0:case 125:C=0;case 59+p:v>0&&wi(R)-h&&Sd(v>32?B2(R+";",r,n,h-1):B2(rt(R," ","")+";",r,n,h-2),c);break;case 59:R+=";";default:if(Sd(_=z2(R,t,n,f,p,i,u,S,E=[],I=[],h),o),w===123)if(p===0)ip(R,t,_,_,E,o,h,u,I);else switch(g===99&&vn(R,3)===110?100:g){case 100:case 109:case 115:ip(e,_,_,r&&Sd(z2(e,_,_,0,0,i,u,S,i,E=[],h),I),i,I,h,u,r?E:I);break;default:ip(R,_,_,_,[""],I,0,u,I)}}f=p=v=0,b=x=1,S=R="",h=s;break;case 58:h=1+wi(R),v=y;default:if(b<1){if(w==123)--b;else if(w==125&&b++==0&&aB()==125)continue}switch(R+=Kh(w),w*b){case 38:x=p>0?1:(R+="\f",-1);break;case 44:u[f++]=(wi(R)-1)*x,x=1;break;case 64:Ii()===45&&(R+=rp(yr())),g=Ii(),p=h=wi(S=R+=cB(np())),w++;break;case 45:y===45&&wi(R)==2&&(b=0)}}return o}function z2(e,t,n,r,i,o,s,u,c,f,p){for(var h=i-1,g=i===0?o:[""],v=px(g),y=0,b=0,C=0;y0?g[x]+" "+w:rt(w,/&\f/g,g[x])))&&(c[C++]=S);return Qh(e,t,n,i===0?fx:u,c,f,p)}function dB(e,t,n){return Qh(e,t,n,hT,Kh(oB()),Pc(e,2,-2),0)}function B2(e,t,n,r){return Qh(e,t,n,dx,Pc(e,0,r),Pc(e,r+1,-1),r)}function el(e,t){for(var n="",r=px(e),i=0;i6)switch(vn(e,t+1)){case 109:if(vn(e,t+4)!==45)break;case 102:return rt(e,/(.+:)(.+)-([^]+)/,"$1"+et+"$2-$3$1"+qp+(vn(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~ry(e,"stretch")?bT(rt(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(vn(e,t+1)!==115)break;case 6444:switch(vn(e,wi(e)-3-(~ry(e,"!important")&&10))){case 107:return rt(e,":",":"+et)+e;case 101:return rt(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+et+(vn(e,14)===45?"inline-":"")+"box$3$1"+et+"$2$3$1"+Pn+"$2box$3")+e}break;case 5936:switch(vn(e,t+11)){case 114:return et+e+Pn+rt(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return et+e+Pn+rt(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return et+e+Pn+rt(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return et+e+Pn+e+e}return e}var wB=function(t,n,r,i){if(t.length>-1&&!t.return)switch(t.type){case dx:t.return=bT(t.value,t.length);break;case mT:return el([hu(t,{value:rt(t.value,"@","@"+et)})],i);case fx:if(t.length)return iB(t.props,function(o){switch(rB(o,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return el([hu(t,{props:[rt(o,/:(read-\w+)/,":"+qp+"$1")]})],i);case"::placeholder":return el([hu(t,{props:[rt(o,/:(plac\w+)/,":"+et+"input-$1")]}),hu(t,{props:[rt(o,/:(plac\w+)/,":"+qp+"$1")]}),hu(t,{props:[rt(o,/:(plac\w+)/,Pn+"input-$1")]})],i)}return""})}},SB=[wB],wT=function(t){var n=t.key;if(n==="css"){var r=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(r,function(b){var C=b.getAttribute("data-emotion");C.indexOf(" ")!==-1&&(document.head.appendChild(b),b.setAttribute("data-s",""))})}var i=t.stylisPlugins||SB,o={},s,u=[];s=t.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+n+' "]'),function(b){for(var C=b.getAttribute("data-emotion").split(" "),x=1;x=4;++r,i-=4)n=e.charCodeAt(r)&255|(e.charCodeAt(++r)&255)<<8|(e.charCodeAt(++r)&255)<<16|(e.charCodeAt(++r)&255)<<24,n=(n&65535)*1540483477+((n>>>16)*59797<<16),n^=n>>>24,t=(n&65535)*1540483477+((n>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(i){case 3:t^=(e.charCodeAt(r+2)&255)<<16;case 2:t^=(e.charCodeAt(r+1)&255)<<8;case 1:t^=e.charCodeAt(r)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}var OB={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},_B=/[A-Z]|^ms/g,PB=/_EMO_([^_]+?)_([^]*?)_EMO_/g,CT=function(t){return t.charCodeAt(1)===45},W2=function(t){return t!=null&&typeof t!="boolean"},Ov=pT(function(e){return CT(e)?e:e.replace(_B,"-$&").toLowerCase()}),U2=function(t,n){switch(t){case"animation":case"animationName":if(typeof n=="string")return n.replace(PB,function(r,i,o){return Si={name:i,styles:o,next:Si},i})}return OB[t]!==1&&!CT(t)&&typeof n=="number"&&n!==0?n+"px":n};function Ic(e,t,n){if(n==null)return"";if(n.__emotion_styles!==void 0)return n;switch(typeof n){case"boolean":return"";case"object":{if(n.anim===1)return Si={name:n.name,styles:n.styles,next:Si},n.name;if(n.styles!==void 0){var r=n.next;if(r!==void 0)for(;r!==void 0;)Si={name:r.name,styles:r.styles,next:Si},r=r.next;var i=n.styles+";";return i}return TB(e,t,n)}case"function":{if(e!==void 0){var o=Si,s=n(e);return Si=o,Ic(e,t,s)}break}}if(t==null)return n;var u=t[n];return u!==void 0?u:n}function TB(e,t,n){var r="";if(Array.isArray(n))for(var i=0;i96?$B:DB},q2=function(t,n,r){var i;if(n){var o=n.shouldForwardProp;i=t.__emotion_forwardProp&&o?function(s){return t.__emotion_forwardProp(s)&&o(s)}:o}return typeof i!="function"&&r&&(i=t.__emotion_forwardProp),i},NB=function(t){var n=t.cache,r=t.serialized,i=t.isStringTag;return ST(n,r,i),RB(function(){return kT(n,r,i)}),null},LB=function e(t,n){var r=t.__emotion_real===t,i=r&&t.__emotion_base||t,o,s;n!==void 0&&(o=n.label,s=n.target);var u=q2(t,n,r),c=u||G2(i),f=!c("as");return function(){var p=arguments,h=r&&t.__emotion_styles!==void 0?t.__emotion_styles.slice(0):[];if(o!==void 0&&h.push("label:"+o+";"),p[0]==null||p[0].raw===void 0)h.push.apply(h,p);else{h.push(p[0][0]);for(var g=p.length,v=1;vt(GB(i)?n:i):t})}function RT(e,t){return zB(e,t)}const qB=(e,t)=>{Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))},YB={},KB=YB;function Jh(e,t){return()=>null}function js(e){return e!==null&&typeof e=="object"&&e.constructor===Object}function xr(e,t,n={clone:!0}){const r=n.clone?z({},e):e;return js(e)&&js(t)&&Object.keys(t).forEach(i=>{i!=="__proto__"&&(js(t[i])&&i in e&&js(e[i])?r[i]=xr(e[i],t[i],n):r[i]=t[i])}),r}const AT=Jh(se.exports.element);AT.isRequired=Jh(se.exports.element.isRequired);const XB=AT,QB=Jh(se.exports.elementType);function ZB(e){return e}function Qo(e){let t="https://mui.com/production-error/?code="+e;for(let n=1;nn==null?t:function(...i){t.apply(this,i),n.apply(this,i)},()=>{})}function gx(e,t=166){let n;function r(...i){const o=()=>{e.apply(this,i)};clearTimeout(n),n=setTimeout(o,t)}return r.clear=()=>{clearTimeout(n)},r}function aj(e,t){return()=>null}function sj(e,t){return T.exports.isValidElement(e)&&t.indexOf(e.type.muiName)!==-1}function bn(e){return e&&e.ownerDocument||document}function Zo(e){return bn(e).defaultView||window}function lj(e,t){return()=>null}function Yp(e,t){typeof e=="function"?e(t):e&&(e.current=t)}const uj=typeof window<"u"?T.exports.useLayoutEffect:T.exports.useEffect,Jo=uj;let K2=0;function cj(e){const[t,n]=T.exports.useState(e),r=e||t;return T.exports.useEffect(()=>{t==null&&(K2+=1,n(`mui-${K2}`))},[t]),r}const X2=Jv["useId"];function vx(e){if(X2!==void 0){const t=X2();return e??t}return cj(e)}function fj(e,t,n,r,i){return null}function $T({controlled:e,default:t,name:n,state:r="value"}){const{current:i}=T.exports.useRef(e!==void 0),[o,s]=T.exports.useState(t),u=i?e:o,c=T.exports.useCallback(f=>{i||s(f)},[]);return[u,c]}function ui(e){const t=T.exports.useRef(e);return Jo(()=>{t.current=e}),T.exports.useCallback((...n)=>(0,t.current)(...n),[])}function Sn(...e){return T.exports.useMemo(()=>e.every(t=>t==null)?null:t=>{e.forEach(n=>{Yp(n,t)})},e)}let em=!0,sy=!1,Q2;const dj={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function pj(e){const{type:t,tagName:n}=e;return!!(n==="INPUT"&&dj[t]&&!e.readOnly||n==="TEXTAREA"&&!e.readOnly||e.isContentEditable)}function hj(e){e.metaKey||e.altKey||e.ctrlKey||(em=!0)}function _v(){em=!1}function mj(){this.visibilityState==="hidden"&&sy&&(em=!0)}function gj(e){e.addEventListener("keydown",hj,!0),e.addEventListener("mousedown",_v,!0),e.addEventListener("pointerdown",_v,!0),e.addEventListener("touchstart",_v,!0),e.addEventListener("visibilitychange",mj,!0)}function vj(e){const{target:t}=e;try{return t.matches(":focus-visible")}catch{}return em||pj(t)}function yx(){const e=T.exports.useCallback(i=>{i!=null&&gj(i.ownerDocument)},[]),t=T.exports.useRef(!1);function n(){return t.current?(sy=!0,window.clearTimeout(Q2),Q2=window.setTimeout(()=>{sy=!1},100),t.current=!1,!0):!1}function r(i){return vj(i)?(t.current=!0,!0):!1}return{isFocusVisibleRef:t,onFocus:r,onBlur:n,ref:e}}function xx(e){const t=e.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}let Es;function DT(){if(Es)return Es;const e=document.createElement("div"),t=document.createElement("div");return t.style.width="10px",t.style.height="1px",e.appendChild(t),e.dir="rtl",e.style.fontSize="14px",e.style.width="4px",e.style.height="1px",e.style.position="absolute",e.style.top="-1000px",e.style.overflow="scroll",document.body.appendChild(e),Es="reverse",e.scrollLeft>0?Es="default":(e.scrollLeft=1,e.scrollLeft===0&&(Es="negative")),document.body.removeChild(e),Es}function yj(e,t){const n=e.scrollLeft;if(t!=="rtl")return n;switch(DT()){case"negative":return e.scrollWidth-e.clientWidth+n;case"reverse":return e.scrollWidth-e.clientWidth-n;default:return n}}const xj=e=>{const t=T.exports.useRef({});return T.exports.useEffect(()=>{t.current=e}),t.current},bj=xj,wj={border:0,clip:"rect(0 0 0 0)",height:"1px",margin:-1,overflow:"hidden",padding:0,position:"absolute",whiteSpace:"nowrap",width:"1px"},Sj=wj;function ly(){return null}ly.isRequired=ly;const kj=ly;function bx(e,t){const n=z({},t);return Object.keys(e).forEach(r=>{n[r]===void 0&&(n[r]=e[r])}),n}function wt(e,t,n){const r={};return Object.keys(e).forEach(i=>{r[i]=e[i].reduce((o,s)=>(s&&(o.push(t(s)),n&&n[s]&&o.push(n[s])),o),[]).join(" ")}),r}const Z2=e=>e,Cj=()=>{let e=Z2;return{configure(t){e=t},generate(t){return e(t)},reset(){e=Z2}}},Ej=Cj(),wx=Ej,Oj={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",required:"required",selected:"selected"};function tt(e,t,n="Mui"){const r=Oj[t];return r?`${n}-${r}`:`${wx.generate(e)}-${t}`}function ct(e,t,n="Mui"){const r={};return t.forEach(i=>{r[i]=tt(e,i,n)}),r}const _j=Object.freeze(Object.defineProperty({__proto__:null,chainPropTypes:Jh,deepmerge:xr,isPlainObject:js,elementAcceptingRef:XB,elementTypeAcceptingRef:QB,exactProp:ZB,formatMuiErrorMessage:Qo,getDisplayName:tj,HTMLElementType:nj,ponyfillGlobal:rj,refType:oj,unstable_capitalize:Ne,unstable_createChainedFunction:ay,unstable_debounce:gx,unstable_deprecatedPropType:aj,unstable_isMuiElement:sj,unstable_ownerDocument:bn,unstable_ownerWindow:Zo,unstable_requirePropFactory:lj,unstable_setRef:Yp,unstable_useEnhancedEffect:Jo,unstable_useId:vx,unstable_unsupportedProp:fj,unstable_useControlled:$T,unstable_useEventCallback:ui,unstable_useForkRef:Sn,unstable_useIsFocusVisible:yx,unstable_getScrollbarSize:xx,unstable_detectScrollType:DT,unstable_getNormalizedScrollLeft:yj,usePreviousProps:bj,visuallyHidden:Sj,integerPropType:kj,internal_resolveProps:bx,unstable_composeClasses:wt,unstable_generateUtilityClass:tt,unstable_generateUtilityClasses:ct,unstable_ClassNameGenerator:wx},Symbol.toStringTag,{value:"Module"}));function tl(e,t){return t?xr(e,t,{clone:!1}):e}const Sx={xs:0,sm:600,md:900,lg:1200,xl:1536},uy={keys:["xs","sm","md","lg","xl"],up:e=>`@media (min-width:${Sx[e]}px)`};function hi(e,t,n){const r=e.theme||{};if(Array.isArray(t)){const o=r.breakpoints||uy;return t.reduce((s,u,c)=>(s[o.up(o.keys[c])]=n(t[c]),s),{})}if(typeof t=="object"){const o=r.breakpoints||uy;return Object.keys(t).reduce((s,u)=>{if(Object.keys(o.values||Sx).indexOf(u)!==-1){const c=o.up(u);s[c]=n(t[u],u)}else{const c=u;s[c]=t[c]}return s},{})}return n(t)}function Pj(e){const t=n=>{const r=n.theme||{},i=e(n),o=r.breakpoints||uy,s=o.keys.reduce((u,c)=>(n[c]&&(u=u||{},u[o.up(c)]=e(z({theme:r},n[c]))),u),null);return tl(i,s)};return t.propTypes={},t.filterProps=["xs","sm","md","lg","xl",...e.filterProps],t}function NT(e={}){var t;return((t=e.keys)==null?void 0:t.reduce((r,i)=>{const o=e.up(i);return r[o]={},r},{}))||{}}function LT(e,t){return e.reduce((n,r)=>{const i=n[r];return(!i||Object.keys(i).length===0)&&delete n[r],n},t)}function FT(e,...t){const n=NT(e),r=[n,...t].reduce((i,o)=>xr(i,o),{});return LT(Object.keys(n),r)}function Tj(e,t){if(typeof e!="object")return{};const n={},r=Object.keys(t);return Array.isArray(e)?r.forEach((i,o)=>{o{e[i]!=null&&(n[i]=!0)}),n}function ap({values:e,breakpoints:t,base:n}){const r=n||Tj(e,t),i=Object.keys(r);if(i.length===0)return e;let o;return i.reduce((s,u,c)=>(Array.isArray(e)?(s[u]=e[c]!=null?e[c]:e[o],o=c):typeof e=="object"?(s[u]=e[u]!=null?e[u]:e[o],o=u):s[u]=e,s),{})}function tm(e,t,n=!0){if(!t||typeof t!="string")return null;if(e&&e.vars&&n){const r=`vars.${t}`.split(".").reduce((i,o)=>i&&i[o]?i[o]:null,e);if(r!=null)return r}return t.split(".").reduce((r,i)=>r&&r[i]!=null?r[i]:null,e)}function cy(e,t,n,r=n){let i;return typeof e=="function"?i=e(n):Array.isArray(e)?i=e[n]||r:i=tm(e,n)||r,t&&(i=t(i,r)),i}function he(e){const{prop:t,cssProperty:n=e.prop,themeKey:r,transform:i}=e,o=s=>{if(s[t]==null)return null;const u=s[t],c=s.theme,f=tm(c,r)||{};return hi(s,u,h=>{let g=cy(f,i,h);return h===g&&typeof h=="string"&&(g=cy(f,i,`${t}${h==="default"?"":Ne(h)}`,h)),n===!1?g:{[n]:g}})};return o.propTypes={},o.filterProps=[t],o}function uo(...e){const t=e.reduce((r,i)=>(i.filterProps.forEach(o=>{r[o]=i}),r),{}),n=r=>Object.keys(r).reduce((i,o)=>t[o]?tl(i,t[o](r)):i,{});return n.propTypes={},n.filterProps=e.reduce((r,i)=>r.concat(i.filterProps),[]),n}function Ij(e){const t={};return n=>(t[n]===void 0&&(t[n]=e(n)),t[n])}const Rj={m:"margin",p:"padding"},Aj={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},J2={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},Mj=Ij(e=>{if(e.length>2)if(J2[e])e=J2[e];else return[e];const[t,n]=e.split(""),r=Rj[t],i=Aj[n]||"";return Array.isArray(i)?i.map(o=>r+o):[r+i]}),kx=["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"],Cx=["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"],zT=[...kx,...Cx];function Tl(e,t,n,r){var i;const o=(i=tm(e,t,!1))!=null?i:n;return typeof o=="number"?s=>typeof s=="string"?s:o*s:Array.isArray(o)?s=>typeof s=="string"?s:o[s]:typeof o=="function"?o:()=>{}}function nm(e){return Tl(e,"spacing",8)}function es(e,t){if(typeof t=="string"||t==null)return t;const n=Math.abs(t),r=e(n);return t>=0?r:typeof r=="number"?-r:`-${r}`}function BT(e,t){return n=>e.reduce((r,i)=>(r[i]=es(t,n),r),{})}function $j(e,t,n,r){if(t.indexOf(n)===-1)return null;const i=Mj(n),o=BT(i,r),s=e[n];return hi(e,s,o)}function Ex(e,t){const n=nm(e.theme);return Object.keys(e).map(r=>$j(e,t,r,n)).reduce(tl,{})}function Ox(e){return Ex(e,kx)}Ox.propTypes={};Ox.filterProps=kx;function _x(e){return Ex(e,Cx)}_x.propTypes={};_x.filterProps=Cx;function Vc(e){return Ex(e,zT)}Vc.propTypes={};Vc.filterProps=zT;function Gc(e){return typeof e!="number"?e:`${e}px solid`}const jT=he({prop:"border",themeKey:"borders",transform:Gc}),WT=he({prop:"borderTop",themeKey:"borders",transform:Gc}),UT=he({prop:"borderRight",themeKey:"borders",transform:Gc}),HT=he({prop:"borderBottom",themeKey:"borders",transform:Gc}),VT=he({prop:"borderLeft",themeKey:"borders",transform:Gc}),GT=he({prop:"borderColor",themeKey:"palette"}),qT=he({prop:"borderTopColor",themeKey:"palette"}),YT=he({prop:"borderRightColor",themeKey:"palette"}),KT=he({prop:"borderBottomColor",themeKey:"palette"}),XT=he({prop:"borderLeftColor",themeKey:"palette"}),rm=e=>{if(e.borderRadius!==void 0&&e.borderRadius!==null){const t=Tl(e.theme,"shape.borderRadius",4),n=r=>({borderRadius:es(t,r)});return hi(e,e.borderRadius,n)}return null};rm.propTypes={};rm.filterProps=["borderRadius"];const Dj=uo(jT,WT,UT,HT,VT,GT,qT,YT,KT,XT,rm),Px=Dj,Nj=he({prop:"displayPrint",cssProperty:!1,transform:e=>({"@media print":{display:e}})}),Lj=he({prop:"display"}),Fj=he({prop:"overflow"}),zj=he({prop:"textOverflow"}),Bj=he({prop:"visibility"}),jj=he({prop:"whiteSpace"}),Tx=uo(Nj,Lj,Fj,zj,Bj,jj),QT=he({prop:"flexBasis"}),ZT=he({prop:"flexDirection"}),JT=he({prop:"flexWrap"}),eI=he({prop:"justifyContent"}),tI=he({prop:"alignItems"}),nI=he({prop:"alignContent"}),rI=he({prop:"order"}),iI=he({prop:"flex"}),oI=he({prop:"flexGrow"}),aI=he({prop:"flexShrink"}),sI=he({prop:"alignSelf"}),lI=he({prop:"justifyItems"}),uI=he({prop:"justifySelf"}),Wj=uo(QT,ZT,JT,eI,tI,nI,rI,iI,oI,aI,sI,lI,uI),Ix=Wj,im=e=>{if(e.gap!==void 0&&e.gap!==null){const t=Tl(e.theme,"spacing",8),n=r=>({gap:es(t,r)});return hi(e,e.gap,n)}return null};im.propTypes={};im.filterProps=["gap"];const om=e=>{if(e.columnGap!==void 0&&e.columnGap!==null){const t=Tl(e.theme,"spacing",8),n=r=>({columnGap:es(t,r)});return hi(e,e.columnGap,n)}return null};om.propTypes={};om.filterProps=["columnGap"];const am=e=>{if(e.rowGap!==void 0&&e.rowGap!==null){const t=Tl(e.theme,"spacing",8),n=r=>({rowGap:es(t,r)});return hi(e,e.rowGap,n)}return null};am.propTypes={};am.filterProps=["rowGap"];const cI=he({prop:"gridColumn"}),fI=he({prop:"gridRow"}),dI=he({prop:"gridAutoFlow"}),pI=he({prop:"gridAutoColumns"}),hI=he({prop:"gridAutoRows"}),mI=he({prop:"gridTemplateColumns"}),gI=he({prop:"gridTemplateRows"}),vI=he({prop:"gridTemplateAreas"}),yI=he({prop:"gridArea"}),Uj=uo(im,om,am,cI,fI,dI,pI,hI,mI,gI,vI,yI),Rx=Uj;function Ax(e,t){return t==="grey"?t:e}const xI=he({prop:"color",themeKey:"palette",transform:Ax}),bI=he({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:Ax}),wI=he({prop:"backgroundColor",themeKey:"palette",transform:Ax}),Hj=uo(xI,bI,wI),Mx=Hj,SI=he({prop:"position"}),kI=he({prop:"zIndex",themeKey:"zIndex"}),CI=he({prop:"top"}),EI=he({prop:"right"}),OI=he({prop:"bottom"}),_I=he({prop:"left"}),$x=uo(SI,kI,CI,EI,OI,_I),Vj=he({prop:"boxShadow",themeKey:"shadows"}),Dx=Vj;function aa(e){return e<=1&&e!==0?`${e*100}%`:e}const PI=he({prop:"width",transform:aa}),Nx=e=>{if(e.maxWidth!==void 0&&e.maxWidth!==null){const t=n=>{var r,i,o;return{maxWidth:((r=e.theme)==null||(i=r.breakpoints)==null||(o=i.values)==null?void 0:o[n])||Sx[n]||aa(n)}};return hi(e,e.maxWidth,t)}return null};Nx.filterProps=["maxWidth"];const TI=he({prop:"minWidth",transform:aa}),II=he({prop:"height",transform:aa}),RI=he({prop:"maxHeight",transform:aa}),AI=he({prop:"minHeight",transform:aa}),Gj=he({prop:"size",cssProperty:"width",transform:aa}),qj=he({prop:"size",cssProperty:"height",transform:aa}),MI=he({prop:"boxSizing"}),Yj=uo(PI,Nx,TI,II,RI,AI,MI),Lx=Yj,$I=he({prop:"fontFamily",themeKey:"typography"}),DI=he({prop:"fontSize",themeKey:"typography"}),NI=he({prop:"fontStyle",themeKey:"typography"}),LI=he({prop:"fontWeight",themeKey:"typography"}),FI=he({prop:"letterSpacing"}),zI=he({prop:"textTransform"}),BI=he({prop:"lineHeight"}),jI=he({prop:"textAlign"}),WI=he({prop:"typography",cssProperty:!1,themeKey:"typography"}),Kj=uo(WI,$I,DI,NI,LI,FI,BI,jI,zI),Fx=Kj,eC={borders:Px.filterProps,display:Tx.filterProps,flexbox:Ix.filterProps,grid:Rx.filterProps,positions:$x.filterProps,palette:Mx.filterProps,shadows:Dx.filterProps,sizing:Lx.filterProps,spacing:Vc.filterProps,typography:Fx.filterProps},UI={borders:Px,display:Tx,flexbox:Ix,grid:Rx,positions:$x,palette:Mx,shadows:Dx,sizing:Lx,spacing:Vc,typography:Fx},HI=Object.keys(eC).reduce((e,t)=>(eC[t].forEach(n=>{e[n]=UI[t]}),e),{});function Xj(e,t,n){const r={[e]:t,theme:n},i=HI[e];return i?i(r):{[e]:t}}function Qj(...e){const t=e.reduce((r,i)=>r.concat(Object.keys(i)),[]),n=new Set(t);return e.every(r=>n.size===Object.keys(r).length)}function Zj(e,t){return typeof e=="function"?e(t):e}function VI(e=UI){const t=Object.keys(e).reduce((i,o)=>(e[o].filterProps.forEach(s=>{i[s]=e[o]}),i),{});function n(i,o,s){const u={[i]:o,theme:s},c=t[i];return c?c(u):{[i]:o}}function r(i){const{sx:o,theme:s={}}=i||{};if(!o)return null;function u(c){let f=c;if(typeof c=="function")f=c(s);else if(typeof c!="object")return c;if(!f)return null;const p=NT(s.breakpoints),h=Object.keys(p);let g=p;return Object.keys(f).forEach(v=>{const y=Zj(f[v],s);if(y!=null)if(typeof y=="object")if(t[v])g=tl(g,n(v,y,s));else{const b=hi({theme:s},y,C=>({[v]:C}));Qj(b,y)?g[v]=r({sx:y,theme:s}):g=tl(g,b)}else g=tl(g,n(v,y,s))}),LT(h,g)}return Array.isArray(o)?o.map(u):u(o)}return r}const GI=VI();GI.filterProps=["sx"];const sm=GI,Jj=["sx"],eW=e=>{const t={systemProps:{},otherProps:{}};return Object.keys(e).forEach(n=>{HI[n]?t.systemProps[n]=e[n]:t.otherProps[n]=e[n]}),t};function qc(e){const{sx:t}=e,n=ke(e,Jj),{systemProps:r,otherProps:i}=eW(n);let o;return Array.isArray(t)?o=[r,...t]:typeof t=="function"?o=(...s)=>{const u=t(...s);return js(u)?z({},r,u):r}:o=z({},r,t),z({},i,{sx:o})}function tW(e){return({theme:t})=>sm({sx:e,theme:t})}function qI(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;t{const t=Object.keys(e).map(n=>({key:n,val:e[n]}))||[];return t.sort((n,r)=>n.val-r.val),t.reduce((n,r)=>z({},n,{[r.key]:r.val}),{})};function YI(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:n="px",step:r=5}=e,i=ke(e,nW),o=rW(t),s=Object.keys(o);function u(g){return`@media (min-width:${typeof t[g]=="number"?t[g]:g}${n})`}function c(g){return`@media (max-width:${(typeof t[g]=="number"?t[g]:g)-r/100}${n})`}function f(g,v){const y=s.indexOf(v);return`@media (min-width:${typeof t[g]=="number"?t[g]:g}${n}) and (max-width:${(y!==-1&&typeof t[s[y]]=="number"?t[s[y]]:v)-r/100}${n})`}function p(g){return s.indexOf(g)+1(r.length===0?[1]:r).map(o=>{const s=t(o);return typeof s=="number"?`${s}px`:s}).join(" ");return n.mui=!0,n}const oW=["breakpoints","palette","spacing","shape"];function ts(e={},...t){const{breakpoints:n={},palette:r={},spacing:i,shape:o={}}=e,s=ke(e,oW),u=YI(n),c=XI(i);let f=xr({breakpoints:u,direction:"ltr",components:{},palette:z({mode:"light"},r),spacing:c,shape:z({},KI,o)},s);return f=t.reduce((p,h)=>xr(p,h),f),f}const aW=T.exports.createContext(null),QI=aW;function zx(){return T.exports.useContext(QI)}const sW=typeof Symbol=="function"&&Symbol.for,lW=sW?Symbol.for("mui.nested"):"__THEME_NESTED__";function uW(e,t){return typeof t=="function"?t(e):z({},e,t)}function cW(e){const{children:t,theme:n}=e,r=zx(),i=T.exports.useMemo(()=>{const o=r===null?n:uW(r,n);return o!=null&&(o[lW]=r!==null),o},[n,r]);return N(QI.Provider,{value:i,children:t})}function fW(e){return Object.keys(e).length===0}function Bx(e=null){const t=zx();return!t||fW(t)?e:t}const dW=ts();function Il(e=dW){return Bx(e)}const pW=["className","component"];function jx(e={}){const{defaultTheme:t,defaultClassName:n="MuiBox-root",generateClassName:r,styleFunctionSx:i=sm}=e,o=RT("div",{shouldForwardProp:u=>u!=="theme"&&u!=="sx"&&u!=="as"})(i);return T.exports.forwardRef(function(c,f){const p=Il(t),h=qc(c),{className:g,component:v="div"}=h,y=ke(h,pW);return N(o,z({as:v,ref:f,className:De(g,r?r(n):n),theme:p},y))})}const hW=jx(),ZI=hW,mW=["variant"];function tC(e){return e.length===0}function JI(e){const{variant:t}=e,n=ke(e,mW);let r=t||"";return Object.keys(n).sort().forEach(i=>{i==="color"?r+=tC(r)?e[i]:Ne(e[i]):r+=`${tC(r)?i:Ne(i)}${Ne(e[i].toString())}`}),r}const gW=["name","slot","skipVariantsResolver","skipSx","overridesResolver"],vW=["theme"],yW=["theme"];function mu(e){return Object.keys(e).length===0}function xW(e){return typeof e=="string"&&e.charCodeAt(0)>96}const bW=(e,t)=>t.components&&t.components[e]&&t.components[e].styleOverrides?t.components[e].styleOverrides:null,wW=(e,t)=>{let n=[];t&&t.components&&t.components[e]&&t.components[e].variants&&(n=t.components[e].variants);const r={};return n.forEach(i=>{const o=JI(i.props);r[o]=i.style}),r},SW=(e,t,n,r)=>{var i,o;const{ownerState:s={}}=e,u=[],c=n==null||(i=n.components)==null||(o=i[r])==null?void 0:o.variants;return c&&c.forEach(f=>{let p=!0;Object.keys(f.props).forEach(h=>{s[h]!==f.props[h]&&e[h]!==f.props[h]&&(p=!1)}),p&&u.push(t[JI(f.props)])}),u};function Zu(e){return e!=="ownerState"&&e!=="theme"&&e!=="sx"&&e!=="as"}const eR=ts();function Wx(e={}){const{defaultTheme:t=eR,rootShouldForwardProp:n=Zu,slotShouldForwardProp:r=Zu,styleFunctionSx:i=sm}=e,o=s=>{const u=mu(s.theme)?t:s.theme;return i(z({},s,{theme:u}))};return o.__mui_systemSx=!0,(s,u={})=>{qB(s,E=>E.filter(I=>!(I!=null&&I.__mui_systemSx)));const{name:c,slot:f,skipVariantsResolver:p,skipSx:h,overridesResolver:g}=u,v=ke(u,gW),y=p!==void 0?p:f&&f!=="Root"||!1,b=h||!1;let C,x=Zu;f==="Root"?x=n:f?x=r:xW(s)&&(x=void 0);const w=RT(s,z({shouldForwardProp:x,label:C},v)),S=(E,...I)=>{const _=I?I.map(L=>typeof L=="function"&&L.__emotion_real!==L?B=>{let{theme:Y}=B,Z=ke(B,vW);return L(z({theme:mu(Y)?t:Y},Z))}:L):[];let R=E;c&&g&&_.push(L=>{const B=mu(L.theme)?t:L.theme,Y=bW(c,B);if(Y){const Z={};return Object.entries(Y).forEach(([re,te])=>{Z[re]=typeof te=="function"?te(z({},L,{theme:B})):te}),g(L,Z)}return null}),c&&!y&&_.push(L=>{const B=mu(L.theme)?t:L.theme;return SW(L,wW(c,B),B,c)}),b||_.push(o);const D=_.length-I.length;if(Array.isArray(E)&&D>0){const L=new Array(D).fill("");R=[...E,...L],R.raw=[...E.raw,...L]}else typeof E=="function"&&E.__emotion_real!==E&&(R=L=>{let{theme:B}=L,Y=ke(L,yW);return E(z({theme:mu(B)?t:B},Y))});return w(R,..._)};return w.withConfig&&(S.withConfig=w.withConfig),S}}const kW=Wx(),lm=kW;function tR(e){const{theme:t,name:n,props:r}=e;return!t||!t.components||!t.components[n]||!t.components[n].defaultProps?r:bx(t.components[n].defaultProps,r)}function Yc({props:e,name:t,defaultTheme:n}){const r=Il(n);return tR({theme:r,name:t,props:e})}function Ux(e,t=0,n=1){return Math.min(Math.max(t,e),n)}function nR(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let n=e.match(t);return n&&n[0].length===1&&(n=n.map(r=>r+r)),n?`rgb${n.length===4?"a":""}(${n.map((r,i)=>i<3?parseInt(r,16):Math.round(parseInt(r,16)/255*1e3)/1e3).join(", ")})`:""}function CW(e){const t=e.toString(16);return t.length===1?`0${t}`:t}function Ai(e){if(e.type)return e;if(e.charAt(0)==="#")return Ai(nR(e));const t=e.indexOf("("),n=e.substring(0,t);if(["rgb","rgba","hsl","hsla","color"].indexOf(n)===-1)throw new Error(Qo(9,e));let r=e.substring(t+1,e.length-1),i;if(n==="color"){if(r=r.split(" "),i=r.shift(),r.length===4&&r[3].charAt(0)==="/"&&(r[3]=r[3].slice(1)),["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].indexOf(i)===-1)throw new Error(Qo(10,i))}else r=r.split(",");return r=r.map(o=>parseFloat(o)),{type:n,values:r,colorSpace:i}}const rR=e=>{const t=Ai(e);return t.values.slice(0,3).map((n,r)=>t.type.indexOf("hsl")!==-1&&r!==0?`${n}%`:n).join(" ")},EW=(e,t)=>{try{return rR(e)}catch{return e}};function Kc(e){const{type:t,colorSpace:n}=e;let{values:r}=e;return t.indexOf("rgb")!==-1?r=r.map((i,o)=>o<3?parseInt(i,10):i):t.indexOf("hsl")!==-1&&(r[1]=`${r[1]}%`,r[2]=`${r[2]}%`),t.indexOf("color")!==-1?r=`${n} ${r.join(" ")}`:r=`${r.join(", ")}`,`${t}(${r})`}function OW(e){if(e.indexOf("#")===0)return e;const{values:t}=Ai(e);return`#${t.map((n,r)=>CW(r===3?Math.round(255*n):n)).join("")}`}function iR(e){e=Ai(e);const{values:t}=e,n=t[0],r=t[1]/100,i=t[2]/100,o=r*Math.min(i,1-i),s=(f,p=(f+n/30)%12)=>i-o*Math.max(Math.min(p-3,9-p,1),-1);let u="rgb";const c=[Math.round(s(0)*255),Math.round(s(8)*255),Math.round(s(4)*255)];return e.type==="hsla"&&(u+="a",c.push(t[3])),Kc({type:u,values:c})}function Kp(e){e=Ai(e);let t=e.type==="hsl"||e.type==="hsla"?Ai(iR(e)).values:e.values;return t=t.map(n=>(e.type!=="color"&&(n/=255),n<=.03928?n/12.92:((n+.055)/1.055)**2.4)),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function oR(e,t){const n=Kp(e),r=Kp(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}function yn(e,t){return e=Ai(e),t=Ux(t),(e.type==="rgb"||e.type==="hsl")&&(e.type+="a"),e.type==="color"?e.values[3]=`/${t}`:e.values[3]=t,Kc(e)}function _W(e,t,n){try{return yn(e,t)}catch{return e}}function ml(e,t){if(e=Ai(e),t=Ux(t),e.type.indexOf("hsl")!==-1)e.values[2]*=1-t;else if(e.type.indexOf("rgb")!==-1||e.type.indexOf("color")!==-1)for(let n=0;n<3;n+=1)e.values[n]*=1-t;return Kc(e)}function PW(e,t,n){try{return ml(e,t)}catch{return e}}function gl(e,t){if(e=Ai(e),t=Ux(t),e.type.indexOf("hsl")!==-1)e.values[2]+=(100-e.values[2])*t;else if(e.type.indexOf("rgb")!==-1)for(let n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;else if(e.type.indexOf("color")!==-1)for(let n=0;n<3;n+=1)e.values[n]+=(1-e.values[n])*t;return Kc(e)}function TW(e,t,n){try{return gl(e,t)}catch{return e}}function aR(e,t=.15){return Kp(e)>.5?ml(e,t):gl(e,t)}function sR(e,t,n){try{return sR(e,t)}catch{return e}}const IW={};function RW(e){const t=Il();return N(mx.Provider,{value:typeof t=="object"?t:IW,children:e.children})}function Hx(e){const{children:t,theme:n}=e;return N(cW,{theme:n,children:N(RW,{children:t})})}const AW=(e,t,n,r=[])=>{let i=e;t.forEach((o,s)=>{s===t.length-1?Array.isArray(i)?i[Number(o)]=n:i&&typeof i=="object"&&(i[o]=n):i&&typeof i=="object"&&(i[o]||(i[o]=r.includes(o)?[]:{}),i=i[o])})},MW=(e,t,n)=>{function r(i,o=[],s=[]){Object.entries(i).forEach(([u,c])=>{(!n||n&&!n([...o,u]))&&c!=null&&(typeof c=="object"&&Object.keys(c).length>0?r(c,[...o,u],Array.isArray(c)?[...s,u]:s):t([...o,u],c,s))})}r(e)},$W=(e,t)=>typeof t=="number"?["lineHeight","fontWeight","opacity","zIndex"].some(r=>e.includes(r))||e[e.length-1].toLowerCase().indexOf("opacity")>=0?t:`${t}px`:t;function nC(e,t){const{prefix:n,shouldSkipGeneratingVar:r}=t||{},i={},o={};return MW(e,(s,u,c)=>{if((typeof u=="string"||typeof u=="number")&&(!r||!r(s,u))){const f=`--${n?`${n}-`:""}${s.join("-")}`;Object.assign(i,{[f]:$W(s,u)}),AW(o,s,`var(${f})`,c)}},s=>s[0]==="vars"),{css:i,vars:o}}const Vx="mode",Gx="color-scheme",lR="data-color-scheme";function DW(e){const{defaultMode:t="light",defaultLightColorScheme:n="light",defaultDarkColorScheme:r="dark",modeStorageKey:i=Vx,colorSchemeStorageKey:o=Gx,attribute:s=lR,colorSchemeNode:u="document.documentElement"}=e||{};return N("script",{dangerouslySetInnerHTML:{__html:`(function() { try { - var mode = localStorage.getItem('${i}') || '${t}'; - var cssColorScheme = mode; - var colorScheme = ''; - if (mode === 'system') { - // handle system mode - var mql = window.matchMedia('(prefers-color-scheme: dark)'); - if (mql.matches) { - cssColorScheme = 'dark'; - colorScheme = localStorage.getItem('${o}-dark') || '${r}'; - } else { - cssColorScheme = 'light'; - colorScheme = localStorage.getItem('${o}-light') || '${n}'; - } - } - if (mode === 'light') { - colorScheme = localStorage.getItem('${o}-light') || '${n}'; - } - if (mode === 'dark') { - colorScheme = localStorage.getItem('${o}-dark') || '${r}'; - } - if (colorScheme) { - ${u}.setAttribute('${s}', colorScheme); - } - } catch (e) {} })();`}},"mui-color-scheme-init")}function rC(e){if(typeof window<"u"&&e==="system")return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function uR(e,t){if(e.mode==="light"||e.mode==="system"&&e.systemMode==="light")return t("light");if(e.mode==="dark"||e.mode==="system"&&e.systemMode==="dark")return t("dark")}function NW(e){return uR(e,t=>{if(t==="light")return e.lightColorScheme;if(t==="dark")return e.darkColorScheme})}function Pv(e,t){if(typeof window>"u")return;let n;try{n=localStorage.getItem(e)||void 0,n||localStorage.setItem(e,t)}catch{}return n||t}function LW(e){const{defaultMode:t="light",defaultLightColorScheme:n,defaultDarkColorScheme:r,supportedColorSchemes:i=[],modeStorageKey:o=Vx,colorSchemeStorageKey:s=Gx,storageWindow:u=typeof window>"u"?void 0:window}=e,c=i.join(","),[f,p]=T.exports.useState(()=>{const C=Pv(o,t),x=Pv(`${s}-light`,n),w=Pv(`${s}-dark`,r);return{mode:C,systemMode:rC(C),lightColorScheme:x,darkColorScheme:w}}),h=NW(f),g=T.exports.useCallback(C=>{p(x=>{if(C===x.mode)return x;const w=C||t;try{localStorage.setItem(o,w)}catch{}return z({},x,{mode:w,systemMode:rC(w)})})},[o,t]),v=T.exports.useCallback(C=>{C?typeof C=="string"?C&&!c.includes(C)?console.error(`\`${C}\` does not exist in \`theme.colorSchemes\`.`):p(x=>{const w=z({},x);return uR(x,S=>{try{localStorage.setItem(`${s}-${S}`,C)}catch{}S==="light"&&(w.lightColorScheme=C),S==="dark"&&(w.darkColorScheme=C)}),w}):p(x=>{const w=z({},x),S=C.light===null?n:C.light,E=C.dark===null?r:C.dark;if(S)if(!c.includes(S))console.error(`\`${S}\` does not exist in \`theme.colorSchemes\`.`);else{w.lightColorScheme=S;try{localStorage.setItem(`${s}-light`,S)}catch{}}if(E)if(!c.includes(E))console.error(`\`${E}\` does not exist in \`theme.colorSchemes\`.`);else{w.darkColorScheme=E;try{localStorage.setItem(`${s}-dark`,E)}catch{}}return w}):p(x=>{try{localStorage.setItem(`${s}-light`,n),localStorage.setItem(`${s}-dark`,r)}catch{}return z({},x,{lightColorScheme:n,darkColorScheme:r})})},[c,s,n,r]),y=T.exports.useCallback(C=>{f.mode==="system"&&p(x=>z({},x,{systemMode:C!=null&&C.matches?"dark":"light"}))},[f.mode]),b=T.exports.useRef(y);return b.current=y,T.exports.useEffect(()=>{const C=(...w)=>b.current(...w),x=window.matchMedia("(prefers-color-scheme: dark)");return x.addListener(C),C(x),()=>x.removeListener(C)},[]),T.exports.useEffect(()=>{const C=x=>{const w=x.newValue;typeof x.key=="string"&&x.key.startsWith(s)&&(!w||c.match(w))&&(x.key.endsWith("light")&&v({light:w}),x.key.endsWith("dark")&&v({dark:w})),x.key===o&&(!w||["light","dark","system"].includes(w))&&g(w||t)};if(u)return u.addEventListener("storage",C),()=>u.removeEventListener("storage",C)},[v,g,o,s,c,t,u]),z({},f,{colorScheme:h,setMode:g,setColorScheme:v})}const FW=["colorSchemes","components","cssVarPrefix"],zW="*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function BW(e){const{theme:t={},attribute:n=lR,modeStorageKey:r=Vx,colorSchemeStorageKey:i=Gx,defaultMode:o="light",defaultColorScheme:s,disableTransitionOnChange:u=!1,shouldSkipGeneratingVar:c,resolveTheme:f,excludeVariablesFromRoot:p}=e;(!t.colorSchemes||typeof s=="string"&&!t.colorSchemes[s]||typeof s=="object"&&!t.colorSchemes[s?.light]||typeof s=="object"&&!t.colorSchemes[s?.dark])&&console.error(`MUI: \`${s}\` does not exist in \`theme.colorSchemes\`.`);const h=T.exports.createContext(void 0),g=()=>{const x=T.exports.useContext(h);if(!x)throw new Error(Qo(19));return x};function v({children:x,theme:w=t,modeStorageKey:S=r,colorSchemeStorageKey:E=i,attribute:I=n,defaultMode:_=o,defaultColorScheme:R=s,disableTransitionOnChange:D=u,storageWindow:W=typeof window>"u"?void 0:window,documentNode:L=typeof document>"u"?void 0:document,colorSchemeNode:B=typeof document>"u"?void 0:document.documentElement,colorSchemeSelector:Y=":root",shouldSkipGeneratingVar:Z=c,disableNestedContext:re=!1,disableStyleSheetGeneration:te=!1}){const oe=T.exports.useRef(!1),le=zx(),H=T.exports.useContext(h),Q=!!H&&!re,{colorSchemes:K={},components:A={},cssVarPrefix:M}=w,we=ke(w,FW),xe=Object.keys(K),Se=typeof R=="string"?R:R.light,me=typeof R=="string"?R:R.dark,{mode:Ae,setMode:Pe,systemMode:de,lightColorScheme:We,darkColorScheme:Ie,colorScheme:qt,setColorScheme:Yt}=LW({supportedColorSchemes:xe,defaultLightColorScheme:Se,defaultDarkColorScheme:me,modeStorageKey:S,colorSchemeStorageKey:E,defaultMode:_,storageWindow:W});let it=Ae,dt=qt;Q&&(it=H.mode,dt=H.colorScheme);const kn=(()=>it||(_==="system"?o:_))(),pt=(()=>dt||(kn==="dark"?me:Se))(),{css:ot,vars:Wn}=nC(we,{prefix:M,shouldSkipGeneratingVar:Z}),Ze=z({},we,{components:A,colorSchemes:K,cssVarPrefix:M,vars:Wn,getColorSchemeSelector:Dt=>`[${I}="${Dt}"] &`}),Qe={},Kt={};Object.entries(K).forEach(([Dt,vt])=>{const{css:V,vars:q}=nC(vt,{prefix:M,shouldSkipGeneratingVar:Z});Ze.vars=xr(Ze.vars,q),Dt===pt&&(Object.keys(vt).forEach(Ce=>{vt[Ce]&&typeof vt[Ce]=="object"?Ze[Ce]=z({},Ze[Ce],vt[Ce]):Ze[Ce]=vt[Ce]}),Ze.palette&&(Ze.palette.colorScheme=Dt));const be=(()=>typeof R=="string"?R:_==="dark"?R.dark:R.light)();if(Dt===be){if(p){const Ce={};p(M).forEach(ft=>{Ce[ft]=V[ft],delete V[ft]}),Qe[`[${I}="${Dt}"]`]=Ce}Qe[`${Y}, [${I}="${Dt}"]`]=V}else Kt[`${Y===":root"?"":Y}[${I}="${Dt}"]`]=V}),T.exports.useEffect(()=>{dt&&B&&B.setAttribute(I,dt)},[dt,I,B]),T.exports.useEffect(()=>{let Dt;if(D&&oe.current&&L){const vt=L.createElement("style");vt.appendChild(L.createTextNode(zW)),L.head.appendChild(vt),window.getComputedStyle(L.body),Dt=setTimeout(()=>{L.head.removeChild(vt)},1)}return()=>{clearTimeout(Dt)}},[dt,D,L]),T.exports.useEffect(()=>(oe.current=!0,()=>{oe.current=!1}),[]);const ln=T.exports.useMemo(()=>({mode:it,systemMode:de,setMode:Pe,lightColorScheme:We,darkColorScheme:Ie,colorScheme:dt,setColorScheme:Yt,allColorSchemes:xe}),[xe,dt,Ie,We,it,Yt,Pe,de]);let Xt=!0;(te||Q&&le?.cssVarPrefix===M)&&(Xt=!1);const ht=ge(T.exports.Fragment,{children:[Xt&&ge(T.exports.Fragment,{children:[N(op,{styles:{[Y]:ot}}),N(op,{styles:Qe}),N(op,{styles:Kt})]}),N(Hx,{theme:f?f(Ze):Ze,children:x})]});return Q?ht:N(h.Provider,{value:ln,children:ht})}const y=typeof s=="string"?s:s.light,b=typeof s=="string"?s:s.dark;return{CssVarsProvider:v,useColorScheme:g,getInitColorSchemeScript:x=>DW(z({attribute:n,colorSchemeStorageKey:i,defaultMode:o,defaultLightColorScheme:y,defaultDarkColorScheme:b,modeStorageKey:r},x))}}function jW(e=""){function t(...r){if(!r.length)return"";const i=r[0];return typeof i=="string"&&!i.match(/(#|\(|\)|(-?(\d*\.)?\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))/)?`, var(--${e?`${e}-`:""}${i}${t(...r.slice(1))})`:`, ${i}`}return(r,...i)=>`var(--${e?`${e}-`:""}${r}${t(...i)})`}const WW=["className","component","disableGutters","fixed","maxWidth","classes"],UW=ts(),HW=lm("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[`maxWidth${Ne(String(n.maxWidth))}`],n.fixed&&t.fixed,n.disableGutters&&t.disableGutters]}}),VW=e=>Yc({props:e,name:"MuiContainer",defaultTheme:UW}),GW=(e,t)=>{const n=c=>tt(t,c),{classes:r,fixed:i,disableGutters:o,maxWidth:s}=e,u={root:["root",s&&`maxWidth${Ne(String(s))}`,i&&"fixed",o&&"disableGutters"]};return wt(u,n,r)};function cR(e={}){const{createStyledComponent:t=HW,useThemeProps:n=VW,componentName:r="MuiContainer"}=e,i=t(({theme:s,ownerState:u})=>z({width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",display:"block"},!u.disableGutters&&{paddingLeft:s.spacing(2),paddingRight:s.spacing(2),[s.breakpoints.up("sm")]:{paddingLeft:s.spacing(3),paddingRight:s.spacing(3)}}),({theme:s,ownerState:u})=>u.fixed&&Object.keys(s.breakpoints.values).reduce((c,f)=>{const p=f,h=s.breakpoints.values[p];return h!==0&&(c[s.breakpoints.up(p)]={maxWidth:`${h}${s.breakpoints.unit}`}),c},{}),({theme:s,ownerState:u})=>z({},u.maxWidth==="xs"&&{[s.breakpoints.up("xs")]:{maxWidth:Math.max(s.breakpoints.values.xs,444)}},u.maxWidth&&u.maxWidth!=="xs"&&{[s.breakpoints.up(u.maxWidth)]:{maxWidth:`${s.breakpoints.values[u.maxWidth]}${s.breakpoints.unit}`}}));return T.exports.forwardRef(function(u,c){const f=n(u),{className:p,component:h="div",disableGutters:g=!1,fixed:v=!1,maxWidth:y="lg"}=f,b=ke(f,WW),C=z({},f,{component:h,disableGutters:g,fixed:v,maxWidth:y}),x=GW(C,r);return N(i,z({as:h,ownerState:C,className:De(x.root,p),ref:c},b))})}const qW=cR(),YW=qW;function KW(e){return tt("MuiContainer",e)}const XW=ct("MuiContainer",["root","disableGutters","fixed","maxWidthXs","maxWidthSm","maxWidthMd","maxWidthLg","maxWidthXl"]),QW=XW,ZW=(e,t)=>e.filter(n=>t.includes(n)),Rl=(e,t,n)=>{const r=e.keys[0];Array.isArray(t)?t.forEach((i,o)=>{n((s,u)=>{o<=e.keys.length-1&&(o===0?Object.assign(s,u):s[e.up(e.keys[o])]=u)},i)}):t&&typeof t=="object"?(Object.keys(t).length>e.keys.length?e.keys:ZW(e.keys,Object.keys(t))).forEach(o=>{if(e.keys.indexOf(o)!==-1){const s=t[o];s!==void 0&&n((u,c)=>{r===o?Object.assign(u,c):u[e.up(o)]=c},s)}}):(typeof t=="number"||typeof t=="string")&&n((i,o)=>{Object.assign(i,o)},t)},JW=({theme:e,ownerState:t})=>{const n={};return Rl(e.breakpoints,t.gridSize,(r,i)=>{let o={};i===!0&&(o={flexBasis:0,flexGrow:1,maxWidth:"100%"}),i==="auto"&&(o={flexBasis:"auto",flexGrow:0,flexShrink:0,maxWidth:"none",width:"auto"}),typeof i=="number"&&(o={flexGrow:0,flexBasis:"auto",width:`calc(100% * ${i} / var(--Grid-columns)${t.nested&&t.container?" + var(--Grid-columnSpacing)":""})`}),r(n,o)}),n},eU=({theme:e,ownerState:t})=>{const n={};return Rl(e.breakpoints,t.gridOffset,(r,i)=>{let o={};i==="auto"&&(o={marginLeft:"auto"}),typeof i=="number"&&(o={marginLeft:i===0?"0px":`calc(100% * ${i} / var(--Grid-columns))`}),r(n,o)}),n},tU=({theme:e,ownerState:t})=>{if(!t.container)return{};const n={"--Grid-columns":12};return Rl(e.breakpoints,t.columns,(r,i)=>{r(n,{"--Grid-columns":i})}),n},nU=({theme:e,ownerState:t})=>{if(!t.container)return{};const n={};return Rl(e.breakpoints,t.rowSpacing,(r,i)=>{var o;r(n,{"--Grid-rowSpacing":typeof i=="string"?i:(o=e.spacing)==null?void 0:o.call(e,i)})}),n},rU=({theme:e,ownerState:t})=>{if(!t.container)return{};const n={};return Rl(e.breakpoints,t.columnSpacing,(r,i)=>{var o;r(n,{"--Grid-columnSpacing":typeof i=="string"?i:(o=e.spacing)==null?void 0:o.call(e,i)})}),n},iU=({theme:e,ownerState:t})=>{if(!t.container)return{};const n={};return Rl(e.breakpoints,t.direction,(r,i)=>{r(n,{flexDirection:i})}),n},oU=({ownerState:e})=>z({minWidth:0,boxSizing:"border-box"},e.container?z({display:"flex",flexWrap:"wrap"},e.wrap&&e.wrap!=="wrap"&&{flexWrap:e.wrap},{margin:"calc(var(--Grid-rowSpacing) / -2) calc(var(--Grid-columnSpacing) / -2)"},e.disableEqualOverflow&&{margin:"calc(var(--Grid-rowSpacing) * -1) 0px 0px calc(var(--Grid-columnSpacing) * -1)"},e.nested?z({padding:"calc(var(--Grid-nested-rowSpacing) / 2) calc(var(--Grid-nested-columnSpacing) / 2)"},(e.disableEqualOverflow||e.parentDisableEqualOverflow)&&{padding:"calc(var(--Grid-nested-rowSpacing)) 0px 0px calc(var(--Grid-nested-columnSpacing))"}):{"--Grid-nested-rowSpacing":"var(--Grid-rowSpacing)","--Grid-nested-columnSpacing":"var(--Grid-columnSpacing)"}):z({padding:"calc(var(--Grid-rowSpacing) / 2) calc(var(--Grid-columnSpacing) / 2)"},e.disableEqualOverflow&&{padding:"calc(var(--Grid-rowSpacing)) 0px 0px calc(var(--Grid-columnSpacing))"})),aU=e=>{const t=[];return Object.entries(e).forEach(([n,r])=>{r!==!1&&r!==void 0&&t.push(`grid-${n}-${String(r)}`)}),t},sU=(e,t="xs")=>{function n(r){return r===void 0?!1:typeof r=="string"&&!Number.isNaN(Number(r))||typeof r=="number"&&r>0}if(n(e))return[`spacing-${t}-${String(e)}`];if(typeof e=="object"&&!Array.isArray(e)){const r=[];return Object.entries(e).forEach(([i,o])=>{n(o)&&r.push(`spacing-${i}-${String(o)}`)}),r}return[]},lU=e=>e===void 0?[]:typeof e=="object"?Object.entries(e).map(([t,n])=>`direction-${t}-${n}`):[`direction-xs-${String(e)}`],uU=["className","columns","container","component","direction","wrap","spacing","rowSpacing","columnSpacing","disableEqualOverflow"],cU=ts(),fU=lm("div",{name:"MuiGrid",slot:"Root",overridesResolver:(e,t)=>t.root});function dU(e){return Yc({props:e,name:"MuiGrid",defaultTheme:cU})}function fR(e={}){const{createStyledComponent:t=fU,useThemeProps:n=dU,componentName:r="MuiGrid"}=e,i=T.exports.createContext(!1),o=T.exports.createContext(void 0),s=(f,p)=>{const{container:h,direction:g,spacing:v,wrap:y,gridSize:b}=f,C={root:["root",h&&"container",y!=="wrap"&&`wrap-xs-${String(y)}`,...lU(g),...aU(b),...h?sU(v,p.breakpoints.keys[0]):[]]};return wt(C,x=>tt(r,x),{})},u=t(tU,rU,nU,JW,iU,oU,eU);return T.exports.forwardRef(function(p,h){var g,v,y,b,C,x,w,S;const E=Il(),I=n(p),_=qc(I),R=T.exports.useContext(i),D=T.exports.useContext(o),{className:W,columns:L=12,container:B=!1,component:Y="div",direction:Z="row",wrap:re="wrap",spacing:te=0,rowSpacing:oe=te,columnSpacing:le=te,disableEqualOverflow:H}=_,Q=ke(_,uU);let K=H;R&&H!==void 0&&(K=p.disableEqualOverflow);const A={},M={},we={};Object.entries(Q).forEach(([Ie,qt])=>{E.breakpoints.values[Ie]!==void 0?A[Ie]=qt:E.breakpoints.values[Ie.replace("Offset","")]!==void 0?M[Ie.replace("Offset","")]=qt:we[Ie]=qt});const xe=(g=p.columns)!=null?g:R?void 0:L,Se=(v=p.spacing)!=null?v:R?void 0:te,me=(y=(b=p.rowSpacing)!=null?b:p.spacing)!=null?y:R?void 0:oe,Ae=(C=(x=p.columnSpacing)!=null?x:p.spacing)!=null?C:R?void 0:le,Pe=z({},_,{nested:R,columns:xe,container:B,direction:Z,wrap:re,spacing:Se,rowSpacing:me,columnSpacing:Ae,gridSize:A,gridOffset:M,disableEqualOverflow:(w=(S=K)!=null?S:D)!=null?w:!1,parentDisableEqualOverflow:D}),de=s(Pe,E);let We=N(u,z({ref:h,as:Y,ownerState:Pe,className:De(de.root,W)},we));return R||(We=N(i.Provider,{value:!0,children:We})),K!==void 0&&K!==(D??!1)&&(We=N(o.Provider,{value:K,children:We})),We})}const pU=fR(),hU=pU;function mU(e){return tt("MuiGrid",e)}const gU=[0,1,2,3,4,5,6,7,8,9,10],vU=["column-reverse","column","row-reverse","row"],yU=["nowrap","wrap-reverse","wrap"],gu=["auto",!0,1,2,3,4,5,6,7,8,9,10,11,12],xU=ct("MuiGrid",["root","container","item",...gU.map(e=>`spacing-xs-${e}`),...vU.map(e=>`direction-xs-${e}`),...yU.map(e=>`wrap-xs-${e}`),...gu.map(e=>`grid-xs-${e}`),...gu.map(e=>`grid-sm-${e}`),...gu.map(e=>`grid-md-${e}`),...gu.map(e=>`grid-lg-${e}`),...gu.map(e=>`grid-xl-${e}`)]),bU=xU,wU=["component","direction","spacing","divider","children","className"],SU=ts(),kU=lm("div",{name:"MuiStack",slot:"Root",overridesResolver:(e,t)=>t.root});function CU(e){return Yc({props:e,name:"MuiStack",defaultTheme:SU})}function EU(e,t){const n=T.exports.Children.toArray(e).filter(Boolean);return n.reduce((r,i,o)=>(r.push(i),o({row:"Left","row-reverse":"Right",column:"Top","column-reverse":"Bottom"})[e],_U=({ownerState:e,theme:t})=>{let n=z({display:"flex",flexDirection:"column"},hi({theme:t},ap({values:e.direction,breakpoints:t.breakpoints.values}),r=>({flexDirection:r})));if(e.spacing){const r=nm(t),i=Object.keys(t.breakpoints.values).reduce((c,f)=>((typeof e.spacing=="object"&&e.spacing[f]!=null||typeof e.direction=="object"&&e.direction[f]!=null)&&(c[f]=!0),c),{}),o=ap({values:e.direction,base:i}),s=ap({values:e.spacing,base:i});typeof o=="object"&&Object.keys(o).forEach((c,f,p)=>{if(!o[c]){const g=f>0?o[p[f-1]]:"column";o[c]=g}}),n=xr(n,hi({theme:t},s,(c,f)=>({"& > :not(style) + :not(style)":{margin:0,[`margin${OU(f?o[f]:e.direction)}`]:es(r,c)}})))}return n=FT(t.breakpoints,n),n};function dR(e={}){const{createStyledComponent:t=kU,useThemeProps:n=CU,componentName:r="MuiStack"}=e,i=()=>wt({root:["root"]},c=>tt(r,c),{}),o=t(_U);return T.exports.forwardRef(function(c,f){const p=n(c),h=qc(p),{component:g="div",direction:v="column",spacing:y=0,divider:b,children:C,className:x}=h,w=ke(h,wU),S={direction:v,spacing:y},E=i();return N(o,z({as:g,ownerState:S,ref:f,className:De(E.root,x)},w,{children:b?EU(C,b):C}))})}const PU=dR(),TU=PU;function IU(e){return tt("MuiStack",e)}const RU=ct("MuiStack",["root"]),AU=RU,MU=Object.freeze(Object.defineProperty({__proto__:null,css:PT,keyframes:Zh,GlobalStyles:op,StyledEngineProvider:VB,borders:Px,breakpoints:Pj,handleBreakpoints:hi,mergeBreakpointsInOrder:FT,unstable_resolveBreakpointValues:ap,compose:uo,display:Tx,flexbox:Ix,grid:Rx,palette:Mx,positions:$x,shadows:Dx,sizing:Lx,spacing:Vc,style:he,getPath:tm,getStyleValue:cy,typography:Fx,unstable_styleFunctionSx:sm,unstable_createStyleFunctionSx:VI,unstable_extendSxProp:qc,experimental_sx:tW,unstable_getThemeValue:Xj,Box:ZI,createBox:jx,createStyled:Wx,styled:lm,createTheme:ts,createBreakpoints:YI,createSpacing:XI,shape:KI,useThemeProps:Yc,getThemeProps:tR,useTheme:Il,useThemeWithoutDefault:Bx,ThemeProvider:Hx,unstable_createCssVarsProvider:BW,unstable_createGetCssVar:jW,responsivePropType:KB,createContainer:cR,Container:YW,Unstable_Grid:hU,Stack:TU,border:jT,borderTop:WT,borderRight:UT,borderBottom:HT,borderLeft:VT,borderColor:GT,borderTopColor:qT,borderRightColor:YT,borderBottomColor:KT,borderLeftColor:XT,borderRadius:rm,flexBasis:QT,flexDirection:ZT,flexWrap:JT,justifyContent:eI,alignItems:tI,alignContent:nI,order:rI,flex:iI,flexGrow:oI,flexShrink:aI,alignSelf:sI,justifyItems:lI,justifySelf:uI,gap:im,columnGap:om,rowGap:am,gridColumn:cI,gridRow:fI,gridAutoFlow:dI,gridAutoColumns:pI,gridAutoRows:hI,gridTemplateColumns:mI,gridTemplateRows:gI,gridTemplateAreas:vI,gridArea:yI,color:xI,bgcolor:bI,backgroundColor:wI,position:SI,zIndex:kI,top:CI,right:EI,bottom:OI,left:_I,width:PI,maxWidth:Nx,minWidth:TI,height:II,maxHeight:RI,minHeight:AI,sizeWidth:Gj,sizeHeight:qj,boxSizing:MI,createUnaryUnit:Tl,createUnarySpacing:nm,getValue:es,getStyleFromPropValue:BT,margin:Ox,padding:_x,fontFamily:$I,fontSize:DI,fontStyle:NI,fontWeight:LI,letterSpacing:FI,textTransform:zI,lineHeight:BI,textAlign:jI,typographyVariant:WI,shouldForwardProp:Zu,systemDefaultTheme:eR,hexToRgb:nR,decomposeColor:Ai,colorChannel:rR,private_safeColorChannel:EW,recomposeColor:Kc,rgbToHex:OW,hslToRgb:iR,getLuminance:Kp,getContrastRatio:oR,alpha:yn,private_safeAlpha:_W,darken:ml,private_safeDarken:PW,lighten:gl,private_safeLighten:TW,emphasize:aR,private_safeEmphasize:sR,containerClasses:QW,getContainerUtilityClass:KW,createGrid:fR,gridClasses:bU,getGridUtilityClass:mU,createStack:dR,stackClasses:AU,getStackUtilityClass:IU},Symbol.toStringTag,{value:"Module"})),$U=Object.freeze(Object.defineProperty({__proto__:null,default:tt},Symbol.toStringTag,{value:"Module"}));function DU(e,t){return z({toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}}},t)}const NU=["mode","contrastThreshold","tonalOffset"],iC={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:_c.white,default:_c.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},Tv={text:{primary:_c.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:_c.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function oC(e,t,n,r){const i=r.light||r,o=r.dark||r*1.5;e[t]||(e.hasOwnProperty(n)?e[t]=e[n]:t==="light"?e.light=gl(e.main,i):t==="dark"&&(e.dark=ml(e.main,o)))}function LU(e="light"){return e==="dark"?{main:Ss[200],light:Ss[50],dark:Ss[400]}:{main:Ss[700],light:Ss[400],dark:Ss[800]}}function FU(e="light"){return e==="dark"?{main:ws[200],light:ws[50],dark:ws[400]}:{main:ws[500],light:ws[300],dark:ws[700]}}function zU(e="light"){return e==="dark"?{main:bs[500],light:bs[300],dark:bs[700]}:{main:bs[700],light:bs[400],dark:bs[800]}}function BU(e="light"){return e==="dark"?{main:ks[400],light:ks[300],dark:ks[700]}:{main:ks[700],light:ks[500],dark:ks[900]}}function jU(e="light"){return e==="dark"?{main:Cs[400],light:Cs[300],dark:Cs[700]}:{main:Cs[800],light:Cs[500],dark:Cs[900]}}function WU(e="light"){return e==="dark"?{main:pu[400],light:pu[300],dark:pu[700]}:{main:"#ed6c02",light:pu[500],dark:pu[900]}}function UU(e){const{mode:t="light",contrastThreshold:n=3,tonalOffset:r=.2}=e,i=ke(e,NU),o=e.primary||LU(t),s=e.secondary||FU(t),u=e.error||zU(t),c=e.info||BU(t),f=e.success||jU(t),p=e.warning||WU(t);function h(b){return oR(b,Tv.text.primary)>=n?Tv.text.primary:iC.text.primary}const g=({color:b,name:C,mainShade:x=500,lightShade:w=300,darkShade:S=700})=>{if(b=z({},b),!b.main&&b[x]&&(b.main=b[x]),!b.hasOwnProperty("main"))throw new Error(Qo(11,C?` (${C})`:"",x));if(typeof b.main!="string")throw new Error(Qo(12,C?` (${C})`:"",JSON.stringify(b.main)));return oC(b,"light",w,r),oC(b,"dark",S,r),b.contrastText||(b.contrastText=h(b.main)),b},v={dark:Tv,light:iC};return xr(z({common:z({},_c),mode:t,primary:g({color:o,name:"primary"}),secondary:g({color:s,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:g({color:u,name:"error"}),warning:g({color:p,name:"warning"}),info:g({color:c,name:"info"}),success:g({color:f,name:"success"}),grey:q7,contrastThreshold:n,getContrastText:h,augmentColor:g,tonalOffset:r},v[t]),i)}const HU=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"];function VU(e){return Math.round(e*1e5)/1e5}const aC={textTransform:"uppercase"},sC='"Roboto", "Helvetica", "Arial", sans-serif';function GU(e,t){const n=typeof t=="function"?t(e):t,{fontFamily:r=sC,fontSize:i=14,fontWeightLight:o=300,fontWeightRegular:s=400,fontWeightMedium:u=500,fontWeightBold:c=700,htmlFontSize:f=16,allVariants:p,pxToRem:h}=n,g=ke(n,HU),v=i/14,y=h||(x=>`${x/f*v}rem`),b=(x,w,S,E,I)=>z({fontFamily:r,fontWeight:x,fontSize:y(w),lineHeight:S},r===sC?{letterSpacing:`${VU(E/w)}em`}:{},I,p),C={h1:b(o,96,1.167,-1.5),h2:b(o,60,1.2,-.5),h3:b(s,48,1.167,0),h4:b(s,34,1.235,.25),h5:b(s,24,1.334,0),h6:b(u,20,1.6,.15),subtitle1:b(s,16,1.75,.15),subtitle2:b(u,14,1.57,.1),body1:b(s,16,1.5,.15),body2:b(s,14,1.43,.15),button:b(u,14,1.75,.4,aC),caption:b(s,12,1.66,.4),overline:b(s,12,2.66,1,aC)};return xr(z({htmlFontSize:f,pxToRem:y,fontFamily:r,fontSize:i,fontWeightLight:o,fontWeightRegular:s,fontWeightMedium:u,fontWeightBold:c},C),g,{clone:!1})}const qU=.2,YU=.14,KU=.12;function At(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${qU})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${YU})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${KU})`].join(",")}const XU=["none",At(0,2,1,-1,0,1,1,0,0,1,3,0),At(0,3,1,-2,0,2,2,0,0,1,5,0),At(0,3,3,-2,0,3,4,0,0,1,8,0),At(0,2,4,-1,0,4,5,0,0,1,10,0),At(0,3,5,-1,0,5,8,0,0,1,14,0),At(0,3,5,-1,0,6,10,0,0,1,18,0),At(0,4,5,-2,0,7,10,1,0,2,16,1),At(0,5,5,-3,0,8,10,1,0,3,14,2),At(0,5,6,-3,0,9,12,1,0,3,16,2),At(0,6,6,-3,0,10,14,1,0,4,18,3),At(0,6,7,-4,0,11,15,1,0,4,20,3),At(0,7,8,-4,0,12,17,2,0,5,22,4),At(0,7,8,-4,0,13,19,2,0,5,24,4),At(0,7,9,-4,0,14,21,2,0,5,26,4),At(0,8,9,-5,0,15,22,2,0,6,28,5),At(0,8,10,-5,0,16,24,2,0,6,30,5),At(0,8,11,-5,0,17,26,2,0,6,32,5),At(0,9,11,-5,0,18,28,2,0,7,34,6),At(0,9,12,-6,0,19,29,2,0,7,36,6),At(0,10,13,-6,0,20,31,3,0,8,38,7),At(0,10,13,-6,0,21,33,3,0,8,40,7),At(0,10,14,-6,0,22,35,3,0,8,42,7),At(0,11,14,-7,0,23,36,3,0,9,44,8),At(0,11,15,-7,0,24,38,3,0,9,46,8)],QU=XU,ZU=["duration","easing","delay"],JU={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},eH={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function lC(e){return`${Math.round(e)}ms`}function tH(e){if(!e)return 0;const t=e/36;return Math.round((4+15*t**.25+t/5)*10)}function nH(e){const t=z({},JU,e.easing),n=z({},eH,e.duration);return z({getAutoHeightDuration:tH,create:(i=["all"],o={})=>{const{duration:s=n.standard,easing:u=t.easeInOut,delay:c=0}=o;return ke(o,ZU),(Array.isArray(i)?i:[i]).map(f=>`${f} ${typeof s=="string"?s:lC(s)} ${u} ${typeof c=="string"?c:lC(c)}`).join(",")}},e,{easing:t,duration:n})}const rH={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500},iH=rH,oH=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];function qx(e={},...t){const{mixins:n={},palette:r={},transitions:i={},typography:o={}}=e,s=ke(e,oH);if(e.vars)throw new Error(Qo(18));const u=UU(r),c=ts(e);let f=xr(c,{mixins:DU(c.breakpoints,n),palette:u,shadows:QU.slice(),typography:GU(u,o),transitions:nH(i),zIndex:z({},iH)});return f=xr(f,s),f=t.reduce((p,h)=>xr(p,h),f),f}const aH=qx(),Yx=aH;function ns(){return Il(Yx)}function Bt({props:e,name:t}){return Yc({props:e,name:t,defaultTheme:Yx})}const um=e=>Zu(e)&&e!=="classes",sH=Wx({defaultTheme:Yx,rootShouldForwardProp:um}),Fe=sH,lH=e=>{let t;return e<1?t=5.11916*e**2:t=4.5*Math.log(e+1)+2,(t/100).toFixed(2)},uC=lH;function pR(e){return typeof e=="string"}function Lu(e,t,n){return e===void 0||pR(e)?t:z({},t,{ownerState:z({},t.ownerState,n)})}function uH(e,t=[]){if(e===void 0)return{};const n={};return Object.keys(e).filter(r=>r.match(/^on[A-Z]/)&&typeof e[r]=="function"&&!t.includes(r)).forEach(r=>{n[r]=e[r]}),n}function fy(e,t){return typeof e=="function"?e(t):e}function cC(e){if(e===void 0)return{};const t={};return Object.keys(e).filter(n=>!(n.match(/^on[A-Z]/)&&typeof e[n]=="function")).forEach(n=>{t[n]=e[n]}),t}function cH(e){const{getSlotProps:t,additionalProps:n,externalSlotProps:r,externalForwardedProps:i,className:o}=e;if(!t){const v=De(i?.className,r?.className,o,n?.className),y=z({},n?.style,i?.style,r?.style),b=z({},n,i,r);return v.length>0&&(b.className=v),Object.keys(y).length>0&&(b.style=y),{props:b,internalRef:void 0}}const s=uH(z({},i,r)),u=cC(r),c=cC(i),f=t(s),p=De(f?.className,n?.className,o,i?.className,r?.className),h=z({},f?.style,n?.style,i?.style,r?.style),g=z({},f,n,c,u);return p.length>0&&(g.className=p),Object.keys(h).length>0&&(g.style=h),{props:g,internalRef:f.ref}}const fH=["elementType","externalSlotProps","ownerState"];function dy(e){var t;const{elementType:n,externalSlotProps:r,ownerState:i}=e,o=ke(e,fH),s=fy(r,i),{props:u,internalRef:c}=cH(z({},o,{externalSlotProps:s})),f=Sn(c,s?.ref,(t=e.additionalProps)==null?void 0:t.ref);return Lu(n,z({},u,{ref:f}),i)}function fC(e){return e.substring(2).toLowerCase()}function dH(e,t){return t.documentElement.clientWidth(setTimeout(()=>{c.current=!0},0),()=>{c.current=!1}),[]);const p=Sn(t.ref,u),h=ui(y=>{const b=f.current;f.current=!1;const C=bn(u.current);if(!c.current||!u.current||"clientX"in y&&dH(y,C))return;if(s.current){s.current=!1;return}let x;y.composedPath?x=y.composedPath().indexOf(u.current)>-1:x=!C.documentElement.contains(y.target)||u.current.contains(y.target),!x&&(n||!b)&&i(y)}),g=y=>b=>{f.current=!0;const C=t.props[y];C&&C(b)},v={ref:p};return o!==!1&&(v[o]=g(o)),T.exports.useEffect(()=>{if(o!==!1){const y=fC(o),b=bn(u.current),C=()=>{s.current=!0};return b.addEventListener(y,h),b.addEventListener("touchmove",C),()=>{b.removeEventListener(y,h),b.removeEventListener("touchmove",C)}}},[h,o]),r!==!1&&(v[r]=g(r)),T.exports.useEffect(()=>{if(r!==!1){const y=fC(r),b=bn(u.current);return b.addEventListener(y,h),()=>{b.removeEventListener(y,h)}}},[h,r]),N(T.exports.Fragment,{children:T.exports.cloneElement(t,v)})}const hH=["input","select","textarea","a[href]","button","[tabindex]","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])'].join(",");function mH(e){const t=parseInt(e.getAttribute("tabindex"),10);return Number.isNaN(t)?e.contentEditable==="true"||(e.nodeName==="AUDIO"||e.nodeName==="VIDEO"||e.nodeName==="DETAILS")&&e.getAttribute("tabindex")===null?0:e.tabIndex:t}function gH(e){if(e.tagName!=="INPUT"||e.type!=="radio"||!e.name)return!1;const t=r=>e.ownerDocument.querySelector(`input[type="radio"]${r}`);let n=t(`[name="${e.name}"]:checked`);return n||(n=t(`[name="${e.name}"]`)),n!==e}function vH(e){return!(e.disabled||e.tagName==="INPUT"&&e.type==="hidden"||gH(e))}function yH(e){const t=[],n=[];return Array.from(e.querySelectorAll(hH)).forEach((r,i)=>{const o=mH(r);o===-1||!vH(r)||(o===0?t.push(r):n.push({documentOrder:i,tabIndex:o,node:r}))}),n.sort((r,i)=>r.tabIndex===i.tabIndex?r.documentOrder-i.documentOrder:r.tabIndex-i.tabIndex).map(r=>r.node).concat(t)}function xH(){return!0}function bH(e){const{children:t,disableAutoFocus:n=!1,disableEnforceFocus:r=!1,disableRestoreFocus:i=!1,getTabbable:o=yH,isEnabled:s=xH,open:u}=e,c=T.exports.useRef(),f=T.exports.useRef(null),p=T.exports.useRef(null),h=T.exports.useRef(null),g=T.exports.useRef(null),v=T.exports.useRef(!1),y=T.exports.useRef(null),b=Sn(t.ref,y),C=T.exports.useRef(null);T.exports.useEffect(()=>{!u||!y.current||(v.current=!n)},[n,u]),T.exports.useEffect(()=>{if(!u||!y.current)return;const S=bn(y.current);return y.current.contains(S.activeElement)||(y.current.hasAttribute("tabIndex")||y.current.setAttribute("tabIndex",-1),v.current&&y.current.focus()),()=>{i||(h.current&&h.current.focus&&(c.current=!0,h.current.focus()),h.current=null)}},[u]),T.exports.useEffect(()=>{if(!u||!y.current)return;const S=bn(y.current),E=R=>{const{current:D}=y;if(D!==null){if(!S.hasFocus()||r||!s()||c.current){c.current=!1;return}if(!D.contains(S.activeElement)){if(R&&g.current!==R.target||S.activeElement!==g.current)g.current=null;else if(g.current!==null)return;if(!v.current)return;let B=[];if((S.activeElement===f.current||S.activeElement===p.current)&&(B=o(y.current)),B.length>0){var W,L;const Y=Boolean(((W=C.current)==null?void 0:W.shiftKey)&&((L=C.current)==null?void 0:L.key)==="Tab"),Z=B[0],re=B[B.length-1];Y?re.focus():Z.focus()}else D.focus()}}},I=R=>{C.current=R,!(r||!s()||R.key!=="Tab")&&S.activeElement===y.current&&R.shiftKey&&(c.current=!0,p.current.focus())};S.addEventListener("focusin",E),S.addEventListener("keydown",I,!0);const _=setInterval(()=>{S.activeElement.tagName==="BODY"&&E()},50);return()=>{clearInterval(_),S.removeEventListener("focusin",E),S.removeEventListener("keydown",I,!0)}},[n,r,i,s,u,o]);const x=S=>{h.current===null&&(h.current=S.relatedTarget),v.current=!0,g.current=S.target;const E=t.props.onFocus;E&&E(S)},w=S=>{h.current===null&&(h.current=S.relatedTarget),v.current=!0};return ge(T.exports.Fragment,{children:[N("div",{tabIndex:u?0:-1,onFocus:w,ref:f,"data-testid":"sentinelStart"}),T.exports.cloneElement(t,{ref:b,onFocus:x}),N("div",{tabIndex:u?0:-1,onFocus:w,ref:p,"data-testid":"sentinelEnd"})]})}var Jn="top",Yr="bottom",Kr="right",er="left",Kx="auto",Xc=[Jn,Yr,Kr,er],vl="start",Rc="end",wH="clippingParents",hR="viewport",vu="popper",SH="reference",dC=Xc.reduce(function(e,t){return e.concat([t+"-"+vl,t+"-"+Rc])},[]),mR=[].concat(Xc,[Kx]).reduce(function(e,t){return e.concat([t,t+"-"+vl,t+"-"+Rc])},[]),kH="beforeRead",CH="read",EH="afterRead",OH="beforeMain",_H="main",PH="afterMain",TH="beforeWrite",IH="write",RH="afterWrite",AH=[kH,CH,EH,OH,_H,PH,TH,IH,RH];function Mi(e){return e?(e.nodeName||"").toLowerCase():null}function Qr(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function qa(e){var t=Qr(e).Element;return e instanceof t||e instanceof Element}function Ur(e){var t=Qr(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Xx(e){if(typeof ShadowRoot>"u")return!1;var t=Qr(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function MH(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},i=t.attributes[n]||{},o=t.elements[n];!Ur(o)||!Mi(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(s){var u=i[s];u===!1?o.removeAttribute(s):o.setAttribute(s,u===!0?"":u)}))})}function $H(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var i=t.elements[r],o=t.attributes[r]||{},s=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),u=s.reduce(function(c,f){return c[f]="",c},{});!Ur(i)||!Mi(i)||(Object.assign(i.style,u),Object.keys(o).forEach(function(c){i.removeAttribute(c)}))})}}const DH={name:"applyStyles",enabled:!0,phase:"write",fn:MH,effect:$H,requires:["computeStyles"]};function Ri(e){return e.split("-")[0]}var Fa=Math.max,Xp=Math.min,yl=Math.round;function py(){var e=navigator.userAgentData;return e!=null&&e.brands?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function gR(){return!/^((?!chrome|android).)*safari/i.test(py())}function xl(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),i=1,o=1;t&&Ur(e)&&(i=e.offsetWidth>0&&yl(r.width)/e.offsetWidth||1,o=e.offsetHeight>0&&yl(r.height)/e.offsetHeight||1);var s=qa(e)?Qr(e):window,u=s.visualViewport,c=!gR()&&n,f=(r.left+(c&&u?u.offsetLeft:0))/i,p=(r.top+(c&&u?u.offsetTop:0))/o,h=r.width/i,g=r.height/o;return{width:h,height:g,top:p,right:f+h,bottom:p+g,left:f,x:f,y:p}}function Qx(e){var t=xl(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function vR(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Xx(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function ro(e){return Qr(e).getComputedStyle(e)}function NH(e){return["table","td","th"].indexOf(Mi(e))>=0}function sa(e){return((qa(e)?e.ownerDocument:e.document)||window.document).documentElement}function cm(e){return Mi(e)==="html"?e:e.assignedSlot||e.parentNode||(Xx(e)?e.host:null)||sa(e)}function pC(e){return!Ur(e)||ro(e).position==="fixed"?null:e.offsetParent}function LH(e){var t=/firefox/i.test(py()),n=/Trident/i.test(py());if(n&&Ur(e)){var r=ro(e);if(r.position==="fixed")return null}var i=cm(e);for(Xx(i)&&(i=i.host);Ur(i)&&["html","body"].indexOf(Mi(i))<0;){var o=ro(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||t&&o.willChange==="filter"||t&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function Qc(e){for(var t=Qr(e),n=pC(e);n&&NH(n)&&ro(n).position==="static";)n=pC(n);return n&&(Mi(n)==="html"||Mi(n)==="body"&&ro(n).position==="static")?t:n||LH(e)||t}function Zx(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Ju(e,t,n){return Fa(e,Xp(t,n))}function FH(e,t,n){var r=Ju(e,t,n);return r>n?n:r}function yR(){return{top:0,right:0,bottom:0,left:0}}function xR(e){return Object.assign({},yR(),e)}function bR(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var zH=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,xR(typeof t!="number"?t:bR(t,Xc))};function BH(e){var t,n=e.state,r=e.name,i=e.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,u=Ri(n.placement),c=Zx(u),f=[er,Kr].indexOf(u)>=0,p=f?"height":"width";if(!(!o||!s)){var h=zH(i.padding,n),g=Qx(o),v=c==="y"?Jn:er,y=c==="y"?Yr:Kr,b=n.rects.reference[p]+n.rects.reference[c]-s[c]-n.rects.popper[p],C=s[c]-n.rects.reference[c],x=Qc(o),w=x?c==="y"?x.clientHeight||0:x.clientWidth||0:0,S=b/2-C/2,E=h[v],I=w-g[p]-h[y],_=w/2-g[p]/2+S,R=Ju(E,_,I),D=c;n.modifiersData[r]=(t={},t[D]=R,t.centerOffset=R-_,t)}}function jH(e){var t=e.state,n=e.options,r=n.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=t.elements.popper.querySelector(i),!i)||!vR(t.elements.popper,i)||(t.elements.arrow=i))}const WH={name:"arrow",enabled:!0,phase:"main",fn:BH,effect:jH,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function bl(e){return e.split("-")[1]}var UH={top:"auto",right:"auto",bottom:"auto",left:"auto"};function HH(e){var t=e.x,n=e.y,r=window,i=r.devicePixelRatio||1;return{x:yl(t*i)/i||0,y:yl(n*i)/i||0}}function hC(e){var t,n=e.popper,r=e.popperRect,i=e.placement,o=e.variation,s=e.offsets,u=e.position,c=e.gpuAcceleration,f=e.adaptive,p=e.roundOffsets,h=e.isFixed,g=s.x,v=g===void 0?0:g,y=s.y,b=y===void 0?0:y,C=typeof p=="function"?p({x:v,y:b}):{x:v,y:b};v=C.x,b=C.y;var x=s.hasOwnProperty("x"),w=s.hasOwnProperty("y"),S=er,E=Jn,I=window;if(f){var _=Qc(n),R="clientHeight",D="clientWidth";if(_===Qr(n)&&(_=sa(n),ro(_).position!=="static"&&u==="absolute"&&(R="scrollHeight",D="scrollWidth")),_=_,i===Jn||(i===er||i===Kr)&&o===Rc){E=Yr;var W=h&&_===I&&I.visualViewport?I.visualViewport.height:_[R];b-=W-r.height,b*=c?1:-1}if(i===er||(i===Jn||i===Yr)&&o===Rc){S=Kr;var L=h&&_===I&&I.visualViewport?I.visualViewport.width:_[D];v-=L-r.width,v*=c?1:-1}}var B=Object.assign({position:u},f&&UH),Y=p===!0?HH({x:v,y:b}):{x:v,y:b};if(v=Y.x,b=Y.y,c){var Z;return Object.assign({},B,(Z={},Z[E]=w?"0":"",Z[S]=x?"0":"",Z.transform=(I.devicePixelRatio||1)<=1?"translate("+v+"px, "+b+"px)":"translate3d("+v+"px, "+b+"px, 0)",Z))}return Object.assign({},B,(t={},t[E]=w?b+"px":"",t[S]=x?v+"px":"",t.transform="",t))}function VH(e){var t=e.state,n=e.options,r=n.gpuAcceleration,i=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,u=n.roundOffsets,c=u===void 0?!0:u,f={placement:Ri(t.placement),variation:bl(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:i,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,hC(Object.assign({},f,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:c})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,hC(Object.assign({},f,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const GH={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:VH,data:{}};var kd={passive:!0};function qH(e){var t=e.state,n=e.instance,r=e.options,i=r.scroll,o=i===void 0?!0:i,s=r.resize,u=s===void 0?!0:s,c=Qr(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&f.forEach(function(p){p.addEventListener("scroll",n.update,kd)}),u&&c.addEventListener("resize",n.update,kd),function(){o&&f.forEach(function(p){p.removeEventListener("scroll",n.update,kd)}),u&&c.removeEventListener("resize",n.update,kd)}}const YH={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:qH,data:{}};var KH={left:"right",right:"left",bottom:"top",top:"bottom"};function sp(e){return e.replace(/left|right|bottom|top/g,function(t){return KH[t]})}var XH={start:"end",end:"start"};function mC(e){return e.replace(/start|end/g,function(t){return XH[t]})}function Jx(e){var t=Qr(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function eb(e){return xl(sa(e)).left+Jx(e).scrollLeft}function QH(e,t){var n=Qr(e),r=sa(e),i=n.visualViewport,o=r.clientWidth,s=r.clientHeight,u=0,c=0;if(i){o=i.width,s=i.height;var f=gR();(f||!f&&t==="fixed")&&(u=i.offsetLeft,c=i.offsetTop)}return{width:o,height:s,x:u+eb(e),y:c}}function ZH(e){var t,n=sa(e),r=Jx(e),i=(t=e.ownerDocument)==null?void 0:t.body,o=Fa(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=Fa(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),u=-r.scrollLeft+eb(e),c=-r.scrollTop;return ro(i||n).direction==="rtl"&&(u+=Fa(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:u,y:c}}function tb(e){var t=ro(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function wR(e){return["html","body","#document"].indexOf(Mi(e))>=0?e.ownerDocument.body:Ur(e)&&tb(e)?e:wR(cm(e))}function ec(e,t){var n;t===void 0&&(t=[]);var r=wR(e),i=r===((n=e.ownerDocument)==null?void 0:n.body),o=Qr(r),s=i?[o].concat(o.visualViewport||[],tb(r)?r:[]):r,u=t.concat(s);return i?u:u.concat(ec(cm(s)))}function hy(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function JH(e,t){var n=xl(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function gC(e,t,n){return t===hR?hy(QH(e,n)):qa(t)?JH(t,n):hy(ZH(sa(e)))}function eV(e){var t=ec(cm(e)),n=["absolute","fixed"].indexOf(ro(e).position)>=0,r=n&&Ur(e)?Qc(e):e;return qa(r)?t.filter(function(i){return qa(i)&&vR(i,r)&&Mi(i)!=="body"}):[]}function tV(e,t,n,r){var i=t==="clippingParents"?eV(e):[].concat(t),o=[].concat(i,[n]),s=o[0],u=o.reduce(function(c,f){var p=gC(e,f,r);return c.top=Fa(p.top,c.top),c.right=Xp(p.right,c.right),c.bottom=Xp(p.bottom,c.bottom),c.left=Fa(p.left,c.left),c},gC(e,s,r));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function SR(e){var t=e.reference,n=e.element,r=e.placement,i=r?Ri(r):null,o=r?bl(r):null,s=t.x+t.width/2-n.width/2,u=t.y+t.height/2-n.height/2,c;switch(i){case Jn:c={x:s,y:t.y-n.height};break;case Yr:c={x:s,y:t.y+t.height};break;case Kr:c={x:t.x+t.width,y:u};break;case er:c={x:t.x-n.width,y:u};break;default:c={x:t.x,y:t.y}}var f=i?Zx(i):null;if(f!=null){var p=f==="y"?"height":"width";switch(o){case vl:c[f]=c[f]-(t[p]/2-n[p]/2);break;case Rc:c[f]=c[f]+(t[p]/2-n[p]/2);break}}return c}function Ac(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=r===void 0?e.placement:r,o=n.strategy,s=o===void 0?e.strategy:o,u=n.boundary,c=u===void 0?wH:u,f=n.rootBoundary,p=f===void 0?hR:f,h=n.elementContext,g=h===void 0?vu:h,v=n.altBoundary,y=v===void 0?!1:v,b=n.padding,C=b===void 0?0:b,x=xR(typeof C!="number"?C:bR(C,Xc)),w=g===vu?SH:vu,S=e.rects.popper,E=e.elements[y?w:g],I=tV(qa(E)?E:E.contextElement||sa(e.elements.popper),c,p,s),_=xl(e.elements.reference),R=SR({reference:_,element:S,strategy:"absolute",placement:i}),D=hy(Object.assign({},S,R)),W=g===vu?D:_,L={top:I.top-W.top+x.top,bottom:W.bottom-I.bottom+x.bottom,left:I.left-W.left+x.left,right:W.right-I.right+x.right},B=e.modifiersData.offset;if(g===vu&&B){var Y=B[i];Object.keys(L).forEach(function(Z){var re=[Kr,Yr].indexOf(Z)>=0?1:-1,te=[Jn,Yr].indexOf(Z)>=0?"y":"x";L[Z]+=Y[te]*re})}return L}function nV(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,u=n.flipVariations,c=n.allowedAutoPlacements,f=c===void 0?mR:c,p=bl(r),h=p?u?dC:dC.filter(function(y){return bl(y)===p}):Xc,g=h.filter(function(y){return f.indexOf(y)>=0});g.length===0&&(g=h);var v=g.reduce(function(y,b){return y[b]=Ac(e,{placement:b,boundary:i,rootBoundary:o,padding:s})[Ri(b)],y},{});return Object.keys(v).sort(function(y,b){return v[y]-v[b]})}function rV(e){if(Ri(e)===Kx)return[];var t=sp(e);return[mC(e),t,mC(t)]}function iV(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,u=s===void 0?!0:s,c=n.fallbackPlacements,f=n.padding,p=n.boundary,h=n.rootBoundary,g=n.altBoundary,v=n.flipVariations,y=v===void 0?!0:v,b=n.allowedAutoPlacements,C=t.options.placement,x=Ri(C),w=x===C,S=c||(w||!y?[sp(C)]:rV(C)),E=[C].concat(S).reduce(function(xe,Se){return xe.concat(Ri(Se)===Kx?nV(t,{placement:Se,boundary:p,rootBoundary:h,padding:f,flipVariations:y,allowedAutoPlacements:b}):Se)},[]),I=t.rects.reference,_=t.rects.popper,R=new Map,D=!0,W=E[0],L=0;L=0,te=re?"width":"height",oe=Ac(t,{placement:B,boundary:p,rootBoundary:h,altBoundary:g,padding:f}),le=re?Z?Kr:er:Z?Yr:Jn;I[te]>_[te]&&(le=sp(le));var H=sp(le),Q=[];if(o&&Q.push(oe[Y]<=0),u&&Q.push(oe[le]<=0,oe[H]<=0),Q.every(function(xe){return xe})){W=B,D=!1;break}R.set(B,Q)}if(D)for(var K=y?3:1,A=function(Se){var me=E.find(function(Ae){var Pe=R.get(Ae);if(Pe)return Pe.slice(0,Se).every(function(de){return de})});if(me)return W=me,"break"},M=K;M>0;M--){var we=A(M);if(we==="break")break}t.placement!==W&&(t.modifiersData[r]._skip=!0,t.placement=W,t.reset=!0)}}const oV={name:"flip",enabled:!0,phase:"main",fn:iV,requiresIfExists:["offset"],data:{_skip:!1}};function vC(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function yC(e){return[Jn,Kr,Yr,er].some(function(t){return e[t]>=0})}function aV(e){var t=e.state,n=e.name,r=t.rects.reference,i=t.rects.popper,o=t.modifiersData.preventOverflow,s=Ac(t,{elementContext:"reference"}),u=Ac(t,{altBoundary:!0}),c=vC(s,r),f=vC(u,i,o),p=yC(c),h=yC(f);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:f,isReferenceHidden:p,hasPopperEscaped:h},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":h})}const sV={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:aV};function lV(e,t,n){var r=Ri(e),i=[er,Jn].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=o[0],u=o[1];return s=s||0,u=(u||0)*i,[er,Kr].indexOf(r)>=0?{x:u,y:s}:{x:s,y:u}}function uV(e){var t=e.state,n=e.options,r=e.name,i=n.offset,o=i===void 0?[0,0]:i,s=mR.reduce(function(p,h){return p[h]=lV(h,t.rects,o),p},{}),u=s[t.placement],c=u.x,f=u.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=f),t.modifiersData[r]=s}const cV={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:uV};function fV(e){var t=e.state,n=e.name;t.modifiersData[n]=SR({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const dV={name:"popperOffsets",enabled:!0,phase:"read",fn:fV,data:{}};function pV(e){return e==="x"?"y":"x"}function hV(e){var t=e.state,n=e.options,r=e.name,i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,u=s===void 0?!1:s,c=n.boundary,f=n.rootBoundary,p=n.altBoundary,h=n.padding,g=n.tether,v=g===void 0?!0:g,y=n.tetherOffset,b=y===void 0?0:y,C=Ac(t,{boundary:c,rootBoundary:f,padding:h,altBoundary:p}),x=Ri(t.placement),w=bl(t.placement),S=!w,E=Zx(x),I=pV(E),_=t.modifiersData.popperOffsets,R=t.rects.reference,D=t.rects.popper,W=typeof b=="function"?b(Object.assign({},t.rects,{placement:t.placement})):b,L=typeof W=="number"?{mainAxis:W,altAxis:W}:Object.assign({mainAxis:0,altAxis:0},W),B=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,Y={x:0,y:0};if(!!_){if(o){var Z,re=E==="y"?Jn:er,te=E==="y"?Yr:Kr,oe=E==="y"?"height":"width",le=_[E],H=le+C[re],Q=le-C[te],K=v?-D[oe]/2:0,A=w===vl?R[oe]:D[oe],M=w===vl?-D[oe]:-R[oe],we=t.elements.arrow,xe=v&&we?Qx(we):{width:0,height:0},Se=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:yR(),me=Se[re],Ae=Se[te],Pe=Ju(0,R[oe],xe[oe]),de=S?R[oe]/2-K-Pe-me-L.mainAxis:A-Pe-me-L.mainAxis,We=S?-R[oe]/2+K+Pe+Ae+L.mainAxis:M+Pe+Ae+L.mainAxis,Ie=t.elements.arrow&&Qc(t.elements.arrow),qt=Ie?E==="y"?Ie.clientTop||0:Ie.clientLeft||0:0,Yt=(Z=B?.[E])!=null?Z:0,it=le+de-Yt-qt,dt=le+We-Yt,kn=Ju(v?Xp(H,it):H,le,v?Fa(Q,dt):Q);_[E]=kn,Y[E]=kn-le}if(u){var pt,ot=E==="x"?Jn:er,Wn=E==="x"?Yr:Kr,Ze=_[I],Qe=I==="y"?"height":"width",Kt=Ze+C[ot],ln=Ze-C[Wn],Xt=[Jn,er].indexOf(x)!==-1,ht=(pt=B?.[I])!=null?pt:0,Dt=Xt?Kt:Ze-R[Qe]-D[Qe]-ht+L.altAxis,vt=Xt?Ze+R[Qe]+D[Qe]-ht-L.altAxis:ln,V=v&&Xt?FH(Dt,Ze,vt):Ju(v?Dt:Kt,Ze,v?vt:ln);_[I]=V,Y[I]=V-Ze}t.modifiersData[r]=Y}}const mV={name:"preventOverflow",enabled:!0,phase:"main",fn:hV,requiresIfExists:["offset"]};function gV(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function vV(e){return e===Qr(e)||!Ur(e)?Jx(e):gV(e)}function yV(e){var t=e.getBoundingClientRect(),n=yl(t.width)/e.offsetWidth||1,r=yl(t.height)/e.offsetHeight||1;return n!==1||r!==1}function xV(e,t,n){n===void 0&&(n=!1);var r=Ur(t),i=Ur(t)&&yV(t),o=sa(t),s=xl(e,i,n),u={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(r||!r&&!n)&&((Mi(t)!=="body"||tb(o))&&(u=vV(t)),Ur(t)?(c=xl(t,!0),c.x+=t.clientLeft,c.y+=t.clientTop):o&&(c.x=eb(o))),{x:s.left+u.scrollLeft-c.x,y:s.top+u.scrollTop-c.y,width:s.width,height:s.height}}function bV(e){var t=new Map,n=new Set,r=[];e.forEach(function(o){t.set(o.name,o)});function i(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(u){if(!n.has(u)){var c=t.get(u);c&&i(c)}}),r.push(o)}return e.forEach(function(o){n.has(o.name)||i(o)}),r}function wV(e){var t=bV(e);return AH.reduce(function(n,r){return n.concat(t.filter(function(i){return i.phase===r}))},[])}function SV(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function kV(e){var t=e.reduce(function(n,r){var i=n[r.name];return n[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var xC={placement:"bottom",modifiers:[],strategy:"absolute"};function bC(){for(var e=arguments.length,t=new Array(e),n=0;n{o||u(_V(i)||document.body)},[i,o]),Jo(()=>{if(s&&!o)return Yp(n,s),()=>{Yp(n,null)}},[n,s,o]),o?T.exports.isValidElement(r)?T.exports.cloneElement(r,{ref:c}):r:N(T.exports.Fragment,{children:s&&Xa.exports.createPortal(r,s)})}),kR=PV;function TV(e){return tt("MuiPopperUnstyled",e)}ct("MuiPopperUnstyled",["root"]);const IV=["anchorEl","children","component","direction","disablePortal","modifiers","open","ownerState","placement","popperOptions","popperRef","slotProps","slots","TransitionProps"],RV=["anchorEl","children","container","direction","disablePortal","keepMounted","modifiers","open","placement","popperOptions","popperRef","style","transition"];function AV(e,t){if(t==="ltr")return e;switch(e){case"bottom-end":return"bottom-start";case"bottom-start":return"bottom-end";case"top-end":return"top-start";case"top-start":return"top-end";default:return e}}function my(e){return typeof e=="function"?e():e}const MV=()=>wt({root:["root"]},TV,{}),$V={},DV=T.exports.forwardRef(function(t,n){var r;const{anchorEl:i,children:o,component:s,direction:u,disablePortal:c,modifiers:f,open:p,ownerState:h,placement:g,popperOptions:v,popperRef:y,slotProps:b={},slots:C={},TransitionProps:x}=t,w=ke(t,IV),S=T.exports.useRef(null),E=Sn(S,n),I=T.exports.useRef(null),_=Sn(I,y),R=T.exports.useRef(_);Jo(()=>{R.current=_},[_]),T.exports.useImperativeHandle(y,()=>I.current,[]);const D=AV(g,u),[W,L]=T.exports.useState(D);T.exports.useEffect(()=>{I.current&&I.current.forceUpdate()}),Jo(()=>{if(!i||!p)return;const te=H=>{L(H.placement)};my(i);let oe=[{name:"preventOverflow",options:{altBoundary:c}},{name:"flip",options:{altBoundary:c}},{name:"onUpdate",enabled:!0,phase:"afterWrite",fn:({state:H})=>{te(H)}}];f!=null&&(oe=oe.concat(f)),v&&v.modifiers!=null&&(oe=oe.concat(v.modifiers));const le=OV(my(i),S.current,z({placement:D},v,{modifiers:oe}));return R.current(le),()=>{le.destroy(),R.current(null)}},[i,c,f,p,v,D]);const B={placement:W};x!==null&&(B.TransitionProps=x);const Y=MV(),Z=(r=s??C.root)!=null?r:"div",re=dy({elementType:Z,externalSlotProps:b.root,externalForwardedProps:w,additionalProps:{role:"tooltip",ref:E},ownerState:z({},t,h),className:Y.root});return N(Z,z({},re,{children:typeof o=="function"?o(B):o}))}),NV=T.exports.forwardRef(function(t,n){const{anchorEl:r,children:i,container:o,direction:s="ltr",disablePortal:u=!1,keepMounted:c=!1,modifiers:f,open:p,placement:h="bottom",popperOptions:g=$V,popperRef:v,style:y,transition:b=!1}=t,C=ke(t,RV),[x,w]=T.exports.useState(!0),S=()=>{w(!1)},E=()=>{w(!0)};if(!c&&!p&&(!b||x))return null;const I=o||(r?bn(my(r)).body:void 0);return N(kR,{disablePortal:u,container:I,children:N(DV,z({anchorEl:r,direction:s,disablePortal:u,modifiers:f,ref:n,open:b?!x:p,placement:h,popperOptions:g,popperRef:v},C,{style:z({position:"fixed",top:0,left:0,display:!p&&c&&(!b||x)?"none":null},y),TransitionProps:b?{in:p,onEnter:S,onExited:E}:null,children:i}))})}),LV=NV;function FV(e){const t=bn(e);return t.body===e?Zo(e).innerWidth>t.documentElement.clientWidth:e.scrollHeight>e.clientHeight}function tc(e,t){t?e.setAttribute("aria-hidden","true"):e.removeAttribute("aria-hidden")}function wC(e){return parseInt(Zo(e).getComputedStyle(e).paddingRight,10)||0}function zV(e){const n=["TEMPLATE","SCRIPT","STYLE","LINK","MAP","META","NOSCRIPT","PICTURE","COL","COLGROUP","PARAM","SLOT","SOURCE","TRACK"].indexOf(e.tagName)!==-1,r=e.tagName==="INPUT"&&e.getAttribute("type")==="hidden";return n||r}function SC(e,t,n,r,i){const o=[t,n,...r];[].forEach.call(e.children,s=>{const u=o.indexOf(s)===-1,c=!zV(s);u&&c&&tc(s,i)})}function Iv(e,t){let n=-1;return e.some((r,i)=>t(r)?(n=i,!0):!1),n}function BV(e,t){const n=[],r=e.container;if(!t.disableScrollLock){if(FV(r)){const s=xx(bn(r));n.push({value:r.style.paddingRight,property:"padding-right",el:r}),r.style.paddingRight=`${wC(r)+s}px`;const u=bn(r).querySelectorAll(".mui-fixed");[].forEach.call(u,c=>{n.push({value:c.style.paddingRight,property:"padding-right",el:c}),c.style.paddingRight=`${wC(c)+s}px`})}let o;if(r.parentNode instanceof DocumentFragment)o=bn(r).body;else{const s=r.parentElement,u=Zo(r);o=s?.nodeName==="HTML"&&u.getComputedStyle(s).overflowY==="scroll"?s:r}n.push({value:o.style.overflow,property:"overflow",el:o},{value:o.style.overflowX,property:"overflow-x",el:o},{value:o.style.overflowY,property:"overflow-y",el:o}),o.style.overflow="hidden"}return()=>{n.forEach(({value:o,el:s,property:u})=>{o?s.style.setProperty(u,o):s.style.removeProperty(u)})}}function jV(e){const t=[];return[].forEach.call(e.children,n=>{n.getAttribute("aria-hidden")==="true"&&t.push(n)}),t}class WV{constructor(){this.containers=void 0,this.modals=void 0,this.modals=[],this.containers=[]}add(t,n){let r=this.modals.indexOf(t);if(r!==-1)return r;r=this.modals.length,this.modals.push(t),t.modalRef&&tc(t.modalRef,!1);const i=jV(n);SC(n,t.mount,t.modalRef,i,!0);const o=Iv(this.containers,s=>s.container===n);return o!==-1?(this.containers[o].modals.push(t),r):(this.containers.push({modals:[t],container:n,restore:null,hiddenSiblings:i}),r)}mount(t,n){const r=Iv(this.containers,o=>o.modals.indexOf(t)!==-1),i=this.containers[r];i.restore||(i.restore=BV(i,n))}remove(t,n=!0){const r=this.modals.indexOf(t);if(r===-1)return r;const i=Iv(this.containers,s=>s.modals.indexOf(t)!==-1),o=this.containers[i];if(o.modals.splice(o.modals.indexOf(t),1),this.modals.splice(r,1),o.modals.length===0)o.restore&&o.restore(),t.modalRef&&tc(t.modalRef,n),SC(o.container,t.mount,t.modalRef,o.hiddenSiblings,!1),this.containers.splice(i,1);else{const s=o.modals[o.modals.length-1];s.modalRef&&tc(s.modalRef,!1)}return r}isTopModal(t){return this.modals.length>0&&this.modals[this.modals.length-1]===t}}function UV(e){return tt("MuiModal",e)}ct("MuiModal",["root","hidden"]);const HV=["children","classes","closeAfterTransition","component","container","disableAutoFocus","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","manager","onBackdropClick","onClose","onKeyDown","open","onTransitionEnter","onTransitionExited","slotProps","slots"],VV=e=>{const{open:t,exited:n,classes:r}=e;return wt({root:["root",!t&&n&&"hidden"]},UV,r)};function GV(e){return typeof e=="function"?e():e}function qV(e){return e.children?e.children.props.hasOwnProperty("in"):!1}const YV=new WV,KV=T.exports.forwardRef(function(t,n){var r,i;const{children:o,classes:s,closeAfterTransition:u=!1,component:c,container:f,disableAutoFocus:p=!1,disableEnforceFocus:h=!1,disableEscapeKeyDown:g=!1,disablePortal:v=!1,disableRestoreFocus:y=!1,disableScrollLock:b=!1,hideBackdrop:C=!1,keepMounted:x=!1,manager:w=YV,onBackdropClick:S,onClose:E,onKeyDown:I,open:_,onTransitionEnter:R,onTransitionExited:D,slotProps:W={},slots:L={}}=t,B=ke(t,HV),[Y,Z]=T.exports.useState(!_),re=T.exports.useRef({}),te=T.exports.useRef(null),oe=T.exports.useRef(null),le=Sn(oe,n),H=qV(t),Q=(r=t["aria-hidden"])!=null?r:!0,K=()=>bn(te.current),A=()=>(re.current.modalRef=oe.current,re.current.mountNode=te.current,re.current),M=()=>{w.mount(A(),{disableScrollLock:b}),oe.current.scrollTop=0},we=ui(()=>{const ot=GV(f)||K().body;w.add(A(),ot),oe.current&&M()}),xe=T.exports.useCallback(()=>w.isTopModal(A()),[w]),Se=ui(ot=>{te.current=ot,ot&&(_&&xe()?M():tc(oe.current,Q))}),me=T.exports.useCallback(()=>{w.remove(A(),Q)},[w,Q]);T.exports.useEffect(()=>()=>{me()},[me]),T.exports.useEffect(()=>{_?we():(!H||!u)&&me()},[_,me,H,u,we]);const Ae=z({},t,{classes:s,closeAfterTransition:u,disableAutoFocus:p,disableEnforceFocus:h,disableEscapeKeyDown:g,disablePortal:v,disableRestoreFocus:y,disableScrollLock:b,exited:Y,hideBackdrop:C,keepMounted:x}),Pe=VV(Ae),de=()=>{Z(!1),R&&R()},We=()=>{Z(!0),D&&D(),u&&me()},Ie=ot=>{ot.target===ot.currentTarget&&(S&&S(ot),E&&E(ot,"backdropClick"))},qt=ot=>{I&&I(ot),!(ot.key!=="Escape"||!xe())&&(g||(ot.stopPropagation(),E&&E(ot,"escapeKeyDown")))},Yt={};o.props.tabIndex===void 0&&(Yt.tabIndex="-1"),H&&(Yt.onEnter=ay(de,o.props.onEnter),Yt.onExited=ay(We,o.props.onExited));const it=(i=c??L.root)!=null?i:"div",dt=dy({elementType:it,externalSlotProps:W.root,externalForwardedProps:B,additionalProps:{ref:le,role:"presentation",onKeyDown:qt},className:Pe.root,ownerState:Ae}),kn=L.backdrop,pt=dy({elementType:kn,externalSlotProps:W.backdrop,additionalProps:{"aria-hidden":!0,onClick:Ie,open:_},className:Pe.backdrop,ownerState:Ae});return!x&&!_&&(!H||Y)?null:N(kR,{ref:Se,container:f,disablePortal:v,children:ge(it,z({},dt,{children:[!C&&kn?N(kn,z({},pt)):null,N(bH,{disableEnforceFocus:h,disableAutoFocus:p,disableRestoreFocus:y,isEnabled:xe,open:_,children:T.exports.cloneElement(o,Yt)})]}))})}),XV=KV;function QV(e){return tt("MuiSvgIcon",e)}ct("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);const ZV=["children","className","color","component","fontSize","htmlColor","inheritViewBox","titleAccess","viewBox"],JV=e=>{const{color:t,fontSize:n,classes:r}=e,i={root:["root",t!=="inherit"&&`color${Ne(t)}`,`fontSize${Ne(n)}`]};return wt(i,QV,r)},eG=Fe("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.color!=="inherit"&&t[`color${Ne(n.color)}`],t[`fontSize${Ne(n.fontSize)}`]]}})(({theme:e,ownerState:t})=>{var n,r,i,o,s,u,c,f,p,h,g,v,y,b,C,x,w;return{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:"currentColor",flexShrink:0,transition:(n=e.transitions)==null||(r=n.create)==null?void 0:r.call(n,"fill",{duration:(i=e.transitions)==null||(o=i.duration)==null?void 0:o.shorter}),fontSize:{inherit:"inherit",small:((s=e.typography)==null||(u=s.pxToRem)==null?void 0:u.call(s,20))||"1.25rem",medium:((c=e.typography)==null||(f=c.pxToRem)==null?void 0:f.call(c,24))||"1.5rem",large:((p=e.typography)==null||(h=p.pxToRem)==null?void 0:h.call(p,35))||"2.1875rem"}[t.fontSize],color:(g=(v=(e.vars||e).palette)==null||(y=v[t.color])==null?void 0:y.main)!=null?g:{action:(b=(e.vars||e).palette)==null||(C=b.action)==null?void 0:C.active,disabled:(x=(e.vars||e).palette)==null||(w=x.action)==null?void 0:w.disabled,inherit:void 0}[t.color]}}),CR=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiSvgIcon"}),{children:i,className:o,color:s="inherit",component:u="svg",fontSize:c="medium",htmlColor:f,inheritViewBox:p=!1,titleAccess:h,viewBox:g="0 0 24 24"}=r,v=ke(r,ZV),y=z({},r,{color:s,component:u,fontSize:c,instanceFontSize:t.fontSize,inheritViewBox:p,viewBox:g}),b={};p||(b.viewBox=g);const C=JV(y);return ge(eG,z({as:u,className:De(C.root,o),focusable:"false",color:f,"aria-hidden":h?void 0:!0,role:h?"img":void 0,ref:n},b,v,{ownerState:y,children:[i,h?N("title",{children:h}):null]}))});CR.muiName="SvgIcon";const Qp=CR;function Zc(e,t){function n(r,i){return N(Qp,z({"data-testid":`${t}Icon`,ref:i},r,{children:e}))}return n.muiName=Qp.muiName,T.exports.memo(T.exports.forwardRef(n))}function gy(e,t){return gy=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,i){return r.__proto__=i,r},gy(e,t)}function ER(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,gy(e,t)}const kC={disabled:!1},Zp=Ye.createContext(null);var tG=function(t){return t.scrollTop},Fu="unmounted",_a="exited",Pa="entering",Ps="entered",vy="exiting",co=function(e){ER(t,e);function t(r,i){var o;o=e.call(this,r,i)||this;var s=i,u=s&&!s.isMounting?r.enter:r.appear,c;return o.appearStatus=null,r.in?u?(c=_a,o.appearStatus=Pa):c=Ps:r.unmountOnExit||r.mountOnEnter?c=Fu:c=_a,o.state={status:c},o.nextCallback=null,o}t.getDerivedStateFromProps=function(i,o){var s=i.in;return s&&o.status===Fu?{status:_a}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(i){var o=null;if(i!==this.props){var s=this.state.status;this.props.in?s!==Pa&&s!==Ps&&(o=Pa):(s===Pa||s===Ps)&&(o=vy)}this.updateStatus(!1,o)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var i=this.props.timeout,o,s,u;return o=s=u=i,i!=null&&typeof i!="number"&&(o=i.exit,s=i.enter,u=i.appear!==void 0?i.appear:s),{exit:o,enter:s,appear:u}},n.updateStatus=function(i,o){if(i===void 0&&(i=!1),o!==null)if(this.cancelNextCallback(),o===Pa){if(this.props.unmountOnExit||this.props.mountOnEnter){var s=this.props.nodeRef?this.props.nodeRef.current:wd.findDOMNode(this);s&&tG(s)}this.performEnter(i)}else this.performExit();else this.props.unmountOnExit&&this.state.status===_a&&this.setState({status:Fu})},n.performEnter=function(i){var o=this,s=this.props.enter,u=this.context?this.context.isMounting:i,c=this.props.nodeRef?[u]:[wd.findDOMNode(this),u],f=c[0],p=c[1],h=this.getTimeouts(),g=u?h.appear:h.enter;if(!i&&!s||kC.disabled){this.safeSetState({status:Ps},function(){o.props.onEntered(f)});return}this.props.onEnter(f,p),this.safeSetState({status:Pa},function(){o.props.onEntering(f,p),o.onTransitionEnd(g,function(){o.safeSetState({status:Ps},function(){o.props.onEntered(f,p)})})})},n.performExit=function(){var i=this,o=this.props.exit,s=this.getTimeouts(),u=this.props.nodeRef?void 0:wd.findDOMNode(this);if(!o||kC.disabled){this.safeSetState({status:_a},function(){i.props.onExited(u)});return}this.props.onExit(u),this.safeSetState({status:vy},function(){i.props.onExiting(u),i.onTransitionEnd(s.exit,function(){i.safeSetState({status:_a},function(){i.props.onExited(u)})})})},n.cancelNextCallback=function(){this.nextCallback!==null&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(i,o){o=this.setNextCallback(o),this.setState(i,o)},n.setNextCallback=function(i){var o=this,s=!0;return this.nextCallback=function(u){s&&(s=!1,o.nextCallback=null,i(u))},this.nextCallback.cancel=function(){s=!1},this.nextCallback},n.onTransitionEnd=function(i,o){this.setNextCallback(o);var s=this.props.nodeRef?this.props.nodeRef.current:wd.findDOMNode(this),u=i==null&&!this.props.addEndListener;if(!s||u){setTimeout(this.nextCallback,0);return}if(this.props.addEndListener){var c=this.props.nodeRef?[this.nextCallback]:[s,this.nextCallback],f=c[0],p=c[1];this.props.addEndListener(f,p)}i!=null&&setTimeout(this.nextCallback,i)},n.render=function(){var i=this.state.status;if(i===Fu)return null;var o=this.props,s=o.children;o.in,o.mountOnEnter,o.unmountOnExit,o.appear,o.enter,o.exit,o.timeout,o.addEndListener,o.onEnter,o.onEntering,o.onEntered,o.onExit,o.onExiting,o.onExited,o.nodeRef;var u=ke(o,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]);return Ye.createElement(Zp.Provider,{value:null},typeof s=="function"?s(i,u):Ye.cloneElement(Ye.Children.only(s),u))},t}(Ye.Component);co.contextType=Zp;co.propTypes={};function Os(){}co.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:Os,onEntering:Os,onEntered:Os,onExit:Os,onExiting:Os,onExited:Os};co.UNMOUNTED=Fu;co.EXITED=_a;co.ENTERING=Pa;co.ENTERED=Ps;co.EXITING=vy;const nb=co;function nG(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function rb(e,t){var n=function(o){return t&&T.exports.isValidElement(o)?t(o):o},r=Object.create(null);return e&&T.exports.Children.map(e,function(i){return i}).forEach(function(i){r[i.key]=n(i)}),r}function rG(e,t){e=e||{},t=t||{};function n(p){return p in t?t[p]:e[p]}var r=Object.create(null),i=[];for(var o in e)o in t?i.length&&(r[o]=i,i=[]):i.push(o);var s,u={};for(var c in t){if(r[c])for(s=0;se.scrollTop;function wl(e,t){var n,r;const{timeout:i,easing:o,style:s={}}=e;return{duration:(n=s.transitionDuration)!=null?n:typeof i=="number"?i:i[t.mode]||0,easing:(r=s.transitionTimingFunction)!=null?r:typeof o=="object"?o[t.mode]:o,delay:s.transitionDelay}}function lG(e){return tt("MuiPaper",e)}ct("MuiPaper",["root","rounded","outlined","elevation","elevation0","elevation1","elevation2","elevation3","elevation4","elevation5","elevation6","elevation7","elevation8","elevation9","elevation10","elevation11","elevation12","elevation13","elevation14","elevation15","elevation16","elevation17","elevation18","elevation19","elevation20","elevation21","elevation22","elevation23","elevation24"]);const uG=["className","component","elevation","square","variant"],cG=e=>{const{square:t,elevation:n,variant:r,classes:i}=e,o={root:["root",r,!t&&"rounded",r==="elevation"&&`elevation${n}`]};return wt(o,lG,i)},fG=Fe("div",{name:"MuiPaper",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[n.variant],!n.square&&t.rounded,n.variant==="elevation"&&t[`elevation${n.elevation}`]]}})(({theme:e,ownerState:t})=>{var n;return z({backgroundColor:(e.vars||e).palette.background.paper,color:(e.vars||e).palette.text.primary,transition:e.transitions.create("box-shadow")},!t.square&&{borderRadius:e.shape.borderRadius},t.variant==="outlined"&&{border:`1px solid ${(e.vars||e).palette.divider}`},t.variant==="elevation"&&z({boxShadow:(e.vars||e).shadows[t.elevation]},!e.vars&&e.palette.mode==="dark"&&{backgroundImage:`linear-gradient(${yn("#fff",uC(t.elevation))}, ${yn("#fff",uC(t.elevation))})`},e.vars&&{backgroundImage:(n=e.vars.overlays)==null?void 0:n[t.elevation]}))}),dG=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiPaper"}),{className:i,component:o="div",elevation:s=1,square:u=!1,variant:c="elevation"}=r,f=ke(r,uG),p=z({},r,{component:o,elevation:s,square:u,variant:c}),h=cG(p);return N(fG,z({as:o,ownerState:p,className:De(h.root,i),ref:n},f))}),Al=dG;function pG(e){const{className:t,classes:n,pulsate:r=!1,rippleX:i,rippleY:o,rippleSize:s,in:u,onExited:c,timeout:f}=e,[p,h]=T.exports.useState(!1),g=De(t,n.ripple,n.rippleVisible,r&&n.ripplePulsate),v={width:s,height:s,top:-(s/2)+o,left:-(s/2)+i},y=De(n.child,p&&n.childLeaving,r&&n.childPulsate);return!u&&!p&&h(!0),T.exports.useEffect(()=>{if(!u&&c!=null){const b=setTimeout(c,f);return()=>{clearTimeout(b)}}},[c,u,f]),N("span",{className:g,style:v,children:N("span",{className:y})})}const hG=ct("MuiTouchRipple",["root","ripple","rippleVisible","ripplePulsate","child","childLeaving","childPulsate"]),Dr=hG,mG=["center","classes","className"];let fm=e=>e,CC,EC,OC,_C;const yy=550,gG=80,vG=Zh(CC||(CC=fm` - 0% { - transform: scale(0); - opacity: 0.1; - } - - 100% { - transform: scale(1); - opacity: 0.3; - } -`)),yG=Zh(EC||(EC=fm` - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -`)),xG=Zh(OC||(OC=fm` - 0% { - transform: scale(1); - } - - 50% { - transform: scale(0.92); - } - - 100% { - transform: scale(1); - } -`)),bG=Fe("span",{name:"MuiTouchRipple",slot:"Root"})({overflow:"hidden",pointerEvents:"none",position:"absolute",zIndex:0,top:0,right:0,bottom:0,left:0,borderRadius:"inherit"}),wG=Fe(pG,{name:"MuiTouchRipple",slot:"Ripple"})(_C||(_C=fm` - opacity: 0; - position: absolute; - - &.${0} { - opacity: 0.3; - transform: scale(1); - animation-name: ${0}; - animation-duration: ${0}ms; - animation-timing-function: ${0}; - } - - &.${0} { - animation-duration: ${0}ms; - } - - & .${0} { - opacity: 1; - display: block; - width: 100%; - height: 100%; - border-radius: 50%; - background-color: currentColor; - } - - & .${0} { - opacity: 0; - animation-name: ${0}; - animation-duration: ${0}ms; - animation-timing-function: ${0}; - } - - & .${0} { - position: absolute; - /* @noflip */ - left: 0px; - top: 0; - animation-name: ${0}; - animation-duration: 2500ms; - animation-timing-function: ${0}; - animation-iteration-count: infinite; - animation-delay: 200ms; - } -`),Dr.rippleVisible,vG,yy,({theme:e})=>e.transitions.easing.easeInOut,Dr.ripplePulsate,({theme:e})=>e.transitions.duration.shorter,Dr.child,Dr.childLeaving,yG,yy,({theme:e})=>e.transitions.easing.easeInOut,Dr.childPulsate,xG,({theme:e})=>e.transitions.easing.easeInOut),SG=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiTouchRipple"}),{center:i=!1,classes:o={},className:s}=r,u=ke(r,mG),[c,f]=T.exports.useState([]),p=T.exports.useRef(0),h=T.exports.useRef(null);T.exports.useEffect(()=>{h.current&&(h.current(),h.current=null)},[c]);const g=T.exports.useRef(!1),v=T.exports.useRef(null),y=T.exports.useRef(null),b=T.exports.useRef(null);T.exports.useEffect(()=>()=>{clearTimeout(v.current)},[]);const C=T.exports.useCallback(E=>{const{pulsate:I,rippleX:_,rippleY:R,rippleSize:D,cb:W}=E;f(L=>[...L,N(wG,{classes:{ripple:De(o.ripple,Dr.ripple),rippleVisible:De(o.rippleVisible,Dr.rippleVisible),ripplePulsate:De(o.ripplePulsate,Dr.ripplePulsate),child:De(o.child,Dr.child),childLeaving:De(o.childLeaving,Dr.childLeaving),childPulsate:De(o.childPulsate,Dr.childPulsate)},timeout:yy,pulsate:I,rippleX:_,rippleY:R,rippleSize:D},p.current)]),p.current+=1,h.current=W},[o]),x=T.exports.useCallback((E={},I={},_=()=>{})=>{const{pulsate:R=!1,center:D=i||I.pulsate,fakeElement:W=!1}=I;if(E?.type==="mousedown"&&g.current){g.current=!1;return}E?.type==="touchstart"&&(g.current=!0);const L=W?null:b.current,B=L?L.getBoundingClientRect():{width:0,height:0,left:0,top:0};let Y,Z,re;if(D||E===void 0||E.clientX===0&&E.clientY===0||!E.clientX&&!E.touches)Y=Math.round(B.width/2),Z=Math.round(B.height/2);else{const{clientX:te,clientY:oe}=E.touches&&E.touches.length>0?E.touches[0]:E;Y=Math.round(te-B.left),Z=Math.round(oe-B.top)}if(D)re=Math.sqrt((2*B.width**2+B.height**2)/3),re%2===0&&(re+=1);else{const te=Math.max(Math.abs((L?L.clientWidth:0)-Y),Y)*2+2,oe=Math.max(Math.abs((L?L.clientHeight:0)-Z),Z)*2+2;re=Math.sqrt(te**2+oe**2)}E!=null&&E.touches?y.current===null&&(y.current=()=>{C({pulsate:R,rippleX:Y,rippleY:Z,rippleSize:re,cb:_})},v.current=setTimeout(()=>{y.current&&(y.current(),y.current=null)},gG)):C({pulsate:R,rippleX:Y,rippleY:Z,rippleSize:re,cb:_})},[i,C]),w=T.exports.useCallback(()=>{x({},{pulsate:!0})},[x]),S=T.exports.useCallback((E,I)=>{if(clearTimeout(v.current),E?.type==="touchend"&&y.current){y.current(),y.current=null,v.current=setTimeout(()=>{S(E,I)});return}y.current=null,f(_=>_.length>0?_.slice(1):_),h.current=I},[]);return T.exports.useImperativeHandle(n,()=>({pulsate:w,start:x,stop:S}),[w,x,S]),N(bG,z({className:De(Dr.root,o.root,s),ref:b},u,{children:N(OR,{component:null,exit:!0,children:c})}))}),kG=SG;function CG(e){return tt("MuiButtonBase",e)}const EG=ct("MuiButtonBase",["root","disabled","focusVisible"]),OG=EG,_G=["action","centerRipple","children","className","component","disabled","disableRipple","disableTouchRipple","focusRipple","focusVisibleClassName","LinkComponent","onBlur","onClick","onContextMenu","onDragLeave","onFocus","onFocusVisible","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchEnd","onTouchMove","onTouchStart","tabIndex","TouchRippleProps","touchRippleRef","type"],PG=e=>{const{disabled:t,focusVisible:n,focusVisibleClassName:r,classes:i}=e,s=wt({root:["root",t&&"disabled",n&&"focusVisible"]},CG,i);return n&&r&&(s.root+=` ${r}`),s},TG=Fe("button",{name:"MuiButtonBase",slot:"Root",overridesResolver:(e,t)=>t.root})({display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",boxSizing:"border-box",WebkitTapHighlightColor:"transparent",backgroundColor:"transparent",outline:0,border:0,margin:0,borderRadius:0,padding:0,cursor:"pointer",userSelect:"none",verticalAlign:"middle",MozAppearance:"none",WebkitAppearance:"none",textDecoration:"none",color:"inherit","&::-moz-focus-inner":{borderStyle:"none"},[`&.${OG.disabled}`]:{pointerEvents:"none",cursor:"default"},"@media print":{colorAdjust:"exact"}}),IG=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiButtonBase"}),{action:i,centerRipple:o=!1,children:s,className:u,component:c="button",disabled:f=!1,disableRipple:p=!1,disableTouchRipple:h=!1,focusRipple:g=!1,LinkComponent:v="a",onBlur:y,onClick:b,onContextMenu:C,onDragLeave:x,onFocus:w,onFocusVisible:S,onKeyDown:E,onKeyUp:I,onMouseDown:_,onMouseLeave:R,onMouseUp:D,onTouchEnd:W,onTouchMove:L,onTouchStart:B,tabIndex:Y=0,TouchRippleProps:Z,touchRippleRef:re,type:te}=r,oe=ke(r,_G),le=T.exports.useRef(null),H=T.exports.useRef(null),Q=Sn(H,re),{isFocusVisibleRef:K,onFocus:A,onBlur:M,ref:we}=yx(),[xe,Se]=T.exports.useState(!1);f&&xe&&Se(!1),T.exports.useImperativeHandle(i,()=>({focusVisible:()=>{Se(!0),le.current.focus()}}),[]);const[me,Ae]=T.exports.useState(!1);T.exports.useEffect(()=>{Ae(!0)},[]);const Pe=me&&!p&&!f;T.exports.useEffect(()=>{xe&&g&&!p&&me&&H.current.pulsate()},[p,g,xe,me]);function de(q,be,Ce=h){return ui(ft=>(be&&be(ft),!Ce&&H.current&&H.current[q](ft),!0))}const We=de("start",_),Ie=de("stop",C),qt=de("stop",x),Yt=de("stop",D),it=de("stop",q=>{xe&&q.preventDefault(),R&&R(q)}),dt=de("start",B),kn=de("stop",W),pt=de("stop",L),ot=de("stop",q=>{M(q),K.current===!1&&Se(!1),y&&y(q)},!1),Wn=ui(q=>{le.current||(le.current=q.currentTarget),A(q),K.current===!0&&(Se(!0),S&&S(q)),w&&w(q)}),Ze=()=>{const q=le.current;return c&&c!=="button"&&!(q.tagName==="A"&&q.href)},Qe=T.exports.useRef(!1),Kt=ui(q=>{g&&!Qe.current&&xe&&H.current&&q.key===" "&&(Qe.current=!0,H.current.stop(q,()=>{H.current.start(q)})),q.target===q.currentTarget&&Ze()&&q.key===" "&&q.preventDefault(),E&&E(q),q.target===q.currentTarget&&Ze()&&q.key==="Enter"&&!f&&(q.preventDefault(),b&&b(q))}),ln=ui(q=>{g&&q.key===" "&&H.current&&xe&&!q.defaultPrevented&&(Qe.current=!1,H.current.stop(q,()=>{H.current.pulsate(q)})),I&&I(q),b&&q.target===q.currentTarget&&Ze()&&q.key===" "&&!q.defaultPrevented&&b(q)});let Xt=c;Xt==="button"&&(oe.href||oe.to)&&(Xt=v);const ht={};Xt==="button"?(ht.type=te===void 0?"button":te,ht.disabled=f):(!oe.href&&!oe.to&&(ht.role="button"),f&&(ht["aria-disabled"]=f));const Dt=Sn(n,we,le),vt=z({},r,{centerRipple:o,component:c,disabled:f,disableRipple:p,disableTouchRipple:h,focusRipple:g,tabIndex:Y,focusVisible:xe}),V=PG(vt);return ge(TG,z({as:Xt,className:De(V.root,u),ownerState:vt,onBlur:ot,onClick:b,onContextMenu:Ie,onFocus:Wn,onKeyDown:Kt,onKeyUp:ln,onMouseDown:We,onMouseLeave:it,onMouseUp:Yt,onDragLeave:qt,onTouchEnd:kn,onTouchMove:pt,onTouchStart:dt,ref:Dt,tabIndex:f?-1:Y,type:te},ht,oe,{children:[s,Pe?N(kG,z({ref:Q,center:o},Z)):null]}))}),ab=IG;function RG(e){return tt("MuiAlert",e)}const AG=ct("MuiAlert",["root","action","icon","message","filled","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]),PC=AG;function MG(e){return tt("MuiIconButton",e)}const $G=ct("MuiIconButton",["root","disabled","colorInherit","colorPrimary","colorSecondary","colorError","colorInfo","colorSuccess","colorWarning","edgeStart","edgeEnd","sizeSmall","sizeMedium","sizeLarge"]),DG=$G,NG=["edge","children","className","color","disabled","disableFocusRipple","size"],LG=e=>{const{classes:t,disabled:n,color:r,edge:i,size:o}=e,s={root:["root",n&&"disabled",r!=="default"&&`color${Ne(r)}`,i&&`edge${Ne(i)}`,`size${Ne(o)}`]};return wt(s,MG,t)},FG=Fe(ab,{name:"MuiIconButton",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.color!=="default"&&t[`color${Ne(n.color)}`],n.edge&&t[`edge${Ne(n.edge)}`],t[`size${Ne(n.size)}`]]}})(({theme:e,ownerState:t})=>z({textAlign:"center",flex:"0 0 auto",fontSize:e.typography.pxToRem(24),padding:8,borderRadius:"50%",overflow:"visible",color:(e.vars||e).palette.action.active,transition:e.transitions.create("background-color",{duration:e.transitions.duration.shortest})},!t.disableRipple&&{"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette.action.activeChannel} / ${e.vars.palette.action.hoverOpacity})`:yn(e.palette.action.active,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},t.edge==="start"&&{marginLeft:t.size==="small"?-3:-12},t.edge==="end"&&{marginRight:t.size==="small"?-3:-12}),({theme:e,ownerState:t})=>{var n;const r=(n=(e.vars||e).palette)==null?void 0:n[t.color];return z({},t.color==="inherit"&&{color:"inherit"},t.color!=="inherit"&&t.color!=="default"&&z({color:r?.main},!t.disableRipple&&{"&:hover":z({},r&&{backgroundColor:e.vars?`rgba(${r.mainChannel} / ${e.vars.palette.action.hoverOpacity})`:yn(r.main,e.palette.action.hoverOpacity)},{"@media (hover: none)":{backgroundColor:"transparent"}})}),t.size==="small"&&{padding:5,fontSize:e.typography.pxToRem(18)},t.size==="large"&&{padding:12,fontSize:e.typography.pxToRem(28)},{[`&.${DG.disabled}`]:{backgroundColor:"transparent",color:(e.vars||e).palette.action.disabled}})}),zG=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiIconButton"}),{edge:i=!1,children:o,className:s,color:u="default",disabled:c=!1,disableFocusRipple:f=!1,size:p="medium"}=r,h=ke(r,NG),g=z({},r,{edge:i,color:u,disabled:c,disableFocusRipple:f,size:p}),v=LG(g);return N(FG,z({className:De(v.root,s),centerRipple:!0,focusRipple:!f,disabled:c,ref:n,ownerState:g},h,{children:o}))}),sb=zG,BG=Zc(N("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),jG=Zc(N("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),WG=Zc(N("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),UG=Zc(N("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),HG=Zc(N("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),VG=["action","children","className","closeText","color","components","componentsProps","icon","iconMapping","onClose","role","severity","slotProps","slots","variant"],GG=e=>{const{variant:t,color:n,severity:r,classes:i}=e,o={root:["root",`${t}${Ne(n||r)}`,`${t}`],icon:["icon"],message:["message"],action:["action"]};return wt(o,RG,i)},qG=Fe(Al,{name:"MuiAlert",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[n.variant],t[`${n.variant}${Ne(n.color||n.severity)}`]]}})(({theme:e,ownerState:t})=>{const n=e.palette.mode==="light"?ml:gl,r=e.palette.mode==="light"?gl:ml,i=t.color||t.severity;return z({},e.typography.body2,{backgroundColor:"transparent",display:"flex",padding:"6px 16px"},i&&t.variant==="standard"&&{color:e.vars?e.vars.palette.Alert[`${i}Color`]:n(e.palette[i].light,.6),backgroundColor:e.vars?e.vars.palette.Alert[`${i}StandardBg`]:r(e.palette[i].light,.9),[`& .${PC.icon}`]:e.vars?{color:e.vars.palette.Alert[`${i}IconColor`]}:{color:e.palette.mode==="dark"?e.palette[i].main:e.palette[i].light}},i&&t.variant==="outlined"&&{color:e.vars?e.vars.palette.Alert[`${i}Color`]:n(e.palette[i].light,.6),border:`1px solid ${(e.vars||e).palette[i].light}`,[`& .${PC.icon}`]:e.vars?{color:e.vars.palette.Alert[`${i}IconColor`]}:{color:e.palette.mode==="dark"?e.palette[i].main:e.palette[i].light}},i&&t.variant==="filled"&&z({fontWeight:e.typography.fontWeightMedium},e.vars?{color:e.vars.palette.Alert[`${i}FilledColor`],backgroundColor:e.vars.palette.Alert[`${i}FilledBg`]}:{backgroundColor:e.palette.mode==="dark"?e.palette[i].dark:e.palette[i].main,color:e.palette.getContrastText(e.palette.mode==="dark"?e.palette[i].dark:e.palette[i].main)}))}),YG=Fe("div",{name:"MuiAlert",slot:"Icon",overridesResolver:(e,t)=>t.icon})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),KG=Fe("div",{name:"MuiAlert",slot:"Message",overridesResolver:(e,t)=>t.message})({padding:"8px 0",minWidth:0,overflow:"auto"}),TC=Fe("div",{name:"MuiAlert",slot:"Action",overridesResolver:(e,t)=>t.action})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),IC={success:N(BG,{fontSize:"inherit"}),warning:N(jG,{fontSize:"inherit"}),error:N(WG,{fontSize:"inherit"}),info:N(UG,{fontSize:"inherit"})},XG=T.exports.forwardRef(function(t,n){var r,i,o,s,u,c;const f=Bt({props:t,name:"MuiAlert"}),{action:p,children:h,className:g,closeText:v="Close",color:y,components:b={},componentsProps:C={},icon:x,iconMapping:w=IC,onClose:S,role:E="alert",severity:I="success",slotProps:_={},slots:R={},variant:D="standard"}=f,W=ke(f,VG),L=z({},f,{color:y,severity:I,variant:D}),B=GG(L),Y=(r=(i=R.closeButton)!=null?i:b.CloseButton)!=null?r:sb,Z=(o=(s=R.closeIcon)!=null?s:b.CloseIcon)!=null?o:HG,re=(u=_.closeButton)!=null?u:C.closeButton,te=(c=_.closeIcon)!=null?c:C.closeIcon;return ge(qG,z({role:E,elevation:0,ownerState:L,className:De(B.root,g),ref:n},W,{children:[x!==!1?N(YG,{ownerState:L,className:B.icon,children:x||w[I]||IC[I]}):null,N(KG,{ownerState:L,className:B.message,children:h}),p!=null?N(TC,{ownerState:L,className:B.action,children:p}):null,p==null&&S?N(TC,{ownerState:L,className:B.action,children:N(Y,z({size:"small","aria-label":v,title:v,color:"inherit",onClick:S},re,{children:N(Z,z({fontSize:"small"},te))}))}):null]}))}),QG=XG;function ZG(e){return tt("MuiTypography",e)}ct("MuiTypography",["root","h1","h2","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","inherit","button","caption","overline","alignLeft","alignRight","alignCenter","alignJustify","noWrap","gutterBottom","paragraph"]);const JG=["align","className","component","gutterBottom","noWrap","paragraph","variant","variantMapping"],eq=e=>{const{align:t,gutterBottom:n,noWrap:r,paragraph:i,variant:o,classes:s}=e,u={root:["root",o,e.align!=="inherit"&&`align${Ne(t)}`,n&&"gutterBottom",r&&"noWrap",i&&"paragraph"]};return wt(u,ZG,s)},tq=Fe("span",{name:"MuiTypography",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.variant&&t[n.variant],n.align!=="inherit"&&t[`align${Ne(n.align)}`],n.noWrap&&t.noWrap,n.gutterBottom&&t.gutterBottom,n.paragraph&&t.paragraph]}})(({theme:e,ownerState:t})=>z({margin:0},t.variant&&e.typography[t.variant],t.align!=="inherit"&&{textAlign:t.align},t.noWrap&&{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},t.gutterBottom&&{marginBottom:"0.35em"},t.paragraph&&{marginBottom:16})),RC={h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",subtitle1:"h6",subtitle2:"h6",body1:"p",body2:"p",inherit:"p"},nq={primary:"primary.main",textPrimary:"text.primary",secondary:"secondary.main",textSecondary:"text.secondary",error:"error.main"},rq=e=>nq[e]||e,iq=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiTypography"}),i=rq(r.color),o=qc(z({},r,{color:i})),{align:s="inherit",className:u,component:c,gutterBottom:f=!1,noWrap:p=!1,paragraph:h=!1,variant:g="body1",variantMapping:v=RC}=o,y=ke(o,JG),b=z({},o,{align:s,color:i,className:u,component:c,gutterBottom:f,noWrap:p,paragraph:h,variant:g,variantMapping:v}),C=c||(h?"p":v[g]||RC[g])||"span",x=eq(b);return N(tq,z({as:C,ref:n,ownerState:b,className:De(x.root,u)},y))}),_R=iq,oq=["components","componentsProps","slots","slotProps"],aq=Fe(LV,{name:"MuiPopper",slot:"Root",overridesResolver:(e,t)=>t.root})({}),sq=T.exports.forwardRef(function(t,n){var r;const i=Bx(),o=Bt({props:t,name:"MuiPopper"}),{components:s,componentsProps:u,slots:c,slotProps:f}=o,p=ke(o,oq),h=(r=c?.root)!=null?r:s?.Root;return N(aq,z({direction:i?.direction,slots:{root:h},slotProps:f??u},p,{ref:n}))}),PR=sq,lq=["addEndListener","appear","children","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"],uq={entering:{opacity:1},entered:{opacity:1}},cq=T.exports.forwardRef(function(t,n){const r=ns(),i={enter:r.transitions.duration.enteringScreen,exit:r.transitions.duration.leavingScreen},{addEndListener:o,appear:s=!0,children:u,easing:c,in:f,onEnter:p,onEntered:h,onEntering:g,onExit:v,onExited:y,onExiting:b,style:C,timeout:x=i,TransitionComponent:w=nb}=t,S=ke(t,lq),E=T.exports.useRef(null),I=Sn(E,u.ref,n),_=re=>te=>{if(re){const oe=E.current;te===void 0?re(oe):re(oe,te)}},R=_(g),D=_((re,te)=>{ob(re);const oe=wl({style:C,timeout:x,easing:c},{mode:"enter"});re.style.webkitTransition=r.transitions.create("opacity",oe),re.style.transition=r.transitions.create("opacity",oe),p&&p(re,te)}),W=_(h),L=_(b),B=_(re=>{const te=wl({style:C,timeout:x,easing:c},{mode:"exit"});re.style.webkitTransition=r.transitions.create("opacity",te),re.style.transition=r.transitions.create("opacity",te),v&&v(re)}),Y=_(y);return N(w,z({appear:s,in:f,nodeRef:E,onEnter:D,onEntered:W,onEntering:R,onExit:B,onExited:Y,onExiting:L,addEndListener:re=>{o&&o(E.current,re)},timeout:x},S,{children:(re,te)=>T.exports.cloneElement(u,z({style:z({opacity:0,visibility:re==="exited"&&!f?"hidden":void 0},uq[re],C,u.props.style),ref:I},te))}))}),dm=cq;function fq(e){return tt("MuiBackdrop",e)}ct("MuiBackdrop",["root","invisible"]);const dq=["children","component","components","componentsProps","className","invisible","open","slotProps","slots","transitionDuration","TransitionComponent"],pq=e=>{const{classes:t,invisible:n}=e;return wt({root:["root",n&&"invisible"]},fq,t)},hq=Fe("div",{name:"MuiBackdrop",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.invisible&&t.invisible]}})(({ownerState:e})=>z({position:"fixed",display:"flex",alignItems:"center",justifyContent:"center",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},e.invisible&&{backgroundColor:"transparent"})),mq=T.exports.forwardRef(function(t,n){var r,i,o;const s=Bt({props:t,name:"MuiBackdrop"}),{children:u,component:c="div",components:f={},componentsProps:p={},className:h,invisible:g=!1,open:v,slotProps:y={},slots:b={},transitionDuration:C,TransitionComponent:x=dm}=s,w=ke(s,dq),S=z({},s,{component:c,invisible:g}),E=pq(S),I=(r=y.root)!=null?r:p.root;return N(x,z({in:v,timeout:C},w,{children:N(hq,z({"aria-hidden":!0},I,{as:(i=(o=b.root)!=null?o:f.Root)!=null?i:c,className:De(E.root,h,I?.className),ownerState:z({},S,I?.ownerState),classes:E,ref:n,children:u}))}))}),TR=mq,gq=qx(),vq=jx({defaultTheme:gq,defaultClassName:"MuiBox-root",generateClassName:wx.generate}),yq=vq;function xq(e){return tt("MuiButton",e)}const bq=ct("MuiButton",["root","text","textInherit","textPrimary","textSecondary","textSuccess","textError","textInfo","textWarning","outlined","outlinedInherit","outlinedPrimary","outlinedSecondary","outlinedSuccess","outlinedError","outlinedInfo","outlinedWarning","contained","containedInherit","containedPrimary","containedSecondary","containedSuccess","containedError","containedInfo","containedWarning","disableElevation","focusVisible","disabled","colorInherit","textSizeSmall","textSizeMedium","textSizeLarge","outlinedSizeSmall","outlinedSizeMedium","outlinedSizeLarge","containedSizeSmall","containedSizeMedium","containedSizeLarge","sizeMedium","sizeSmall","sizeLarge","fullWidth","startIcon","endIcon","iconSizeSmall","iconSizeMedium","iconSizeLarge"]),Cd=bq,wq=T.exports.createContext({}),Sq=wq,kq=["children","color","component","className","disabled","disableElevation","disableFocusRipple","endIcon","focusVisibleClassName","fullWidth","size","startIcon","type","variant"],Cq=e=>{const{color:t,disableElevation:n,fullWidth:r,size:i,variant:o,classes:s}=e,u={root:["root",o,`${o}${Ne(t)}`,`size${Ne(i)}`,`${o}Size${Ne(i)}`,t==="inherit"&&"colorInherit",n&&"disableElevation",r&&"fullWidth"],label:["label"],startIcon:["startIcon",`iconSize${Ne(i)}`],endIcon:["endIcon",`iconSize${Ne(i)}`]},c=wt(u,xq,s);return z({},s,c)},IR=e=>z({},e.size==="small"&&{"& > *:nth-of-type(1)":{fontSize:18}},e.size==="medium"&&{"& > *:nth-of-type(1)":{fontSize:20}},e.size==="large"&&{"& > *:nth-of-type(1)":{fontSize:22}}),Eq=Fe(ab,{shouldForwardProp:e=>um(e)||e==="classes",name:"MuiButton",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[n.variant],t[`${n.variant}${Ne(n.color)}`],t[`size${Ne(n.size)}`],t[`${n.variant}Size${Ne(n.size)}`],n.color==="inherit"&&t.colorInherit,n.disableElevation&&t.disableElevation,n.fullWidth&&t.fullWidth]}})(({theme:e,ownerState:t})=>{var n,r;return z({},e.typography.button,{minWidth:64,padding:"6px 16px",borderRadius:(e.vars||e).shape.borderRadius,transition:e.transitions.create(["background-color","box-shadow","border-color","color"],{duration:e.transitions.duration.short}),"&:hover":z({textDecoration:"none",backgroundColor:e.vars?`rgba(${e.vars.palette.text.primaryChannel} / ${e.vars.palette.action.hoverOpacity})`:yn(e.palette.text.primary,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},t.variant==="text"&&t.color!=="inherit"&&{backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.hoverOpacity})`:yn(e.palette[t.color].main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},t.variant==="outlined"&&t.color!=="inherit"&&{border:`1px solid ${(e.vars||e).palette[t.color].main}`,backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.hoverOpacity})`:yn(e.palette[t.color].main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},t.variant==="contained"&&{backgroundColor:(e.vars||e).palette.grey.A100,boxShadow:(e.vars||e).shadows[4],"@media (hover: none)":{boxShadow:(e.vars||e).shadows[2],backgroundColor:(e.vars||e).palette.grey[300]}},t.variant==="contained"&&t.color!=="inherit"&&{backgroundColor:(e.vars||e).palette[t.color].dark,"@media (hover: none)":{backgroundColor:(e.vars||e).palette[t.color].main}}),"&:active":z({},t.variant==="contained"&&{boxShadow:(e.vars||e).shadows[8]}),[`&.${Cd.focusVisible}`]:z({},t.variant==="contained"&&{boxShadow:(e.vars||e).shadows[6]}),[`&.${Cd.disabled}`]:z({color:(e.vars||e).palette.action.disabled},t.variant==="outlined"&&{border:`1px solid ${(e.vars||e).palette.action.disabledBackground}`},t.variant==="outlined"&&t.color==="secondary"&&{border:`1px solid ${(e.vars||e).palette.action.disabled}`},t.variant==="contained"&&{color:(e.vars||e).palette.action.disabled,boxShadow:(e.vars||e).shadows[0],backgroundColor:(e.vars||e).palette.action.disabledBackground})},t.variant==="text"&&{padding:"6px 8px"},t.variant==="text"&&t.color!=="inherit"&&{color:(e.vars||e).palette[t.color].main},t.variant==="outlined"&&{padding:"5px 15px",border:"1px solid currentColor"},t.variant==="outlined"&&t.color!=="inherit"&&{color:(e.vars||e).palette[t.color].main,border:e.vars?`1px solid rgba(${e.vars.palette[t.color].mainChannel} / 0.5)`:`1px solid ${yn(e.palette[t.color].main,.5)}`},t.variant==="contained"&&{color:e.vars?e.vars.palette.text.primary:(n=(r=e.palette).getContrastText)==null?void 0:n.call(r,e.palette.grey[300]),backgroundColor:(e.vars||e).palette.grey[300],boxShadow:(e.vars||e).shadows[2]},t.variant==="contained"&&t.color!=="inherit"&&{color:(e.vars||e).palette[t.color].contrastText,backgroundColor:(e.vars||e).palette[t.color].main},t.color==="inherit"&&{color:"inherit",borderColor:"currentColor"},t.size==="small"&&t.variant==="text"&&{padding:"4px 5px",fontSize:e.typography.pxToRem(13)},t.size==="large"&&t.variant==="text"&&{padding:"8px 11px",fontSize:e.typography.pxToRem(15)},t.size==="small"&&t.variant==="outlined"&&{padding:"3px 9px",fontSize:e.typography.pxToRem(13)},t.size==="large"&&t.variant==="outlined"&&{padding:"7px 21px",fontSize:e.typography.pxToRem(15)},t.size==="small"&&t.variant==="contained"&&{padding:"4px 10px",fontSize:e.typography.pxToRem(13)},t.size==="large"&&t.variant==="contained"&&{padding:"8px 22px",fontSize:e.typography.pxToRem(15)},t.fullWidth&&{width:"100%"})},({ownerState:e})=>e.disableElevation&&{boxShadow:"none","&:hover":{boxShadow:"none"},[`&.${Cd.focusVisible}`]:{boxShadow:"none"},"&:active":{boxShadow:"none"},[`&.${Cd.disabled}`]:{boxShadow:"none"}}),Oq=Fe("span",{name:"MuiButton",slot:"StartIcon",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.startIcon,t[`iconSize${Ne(n.size)}`]]}})(({ownerState:e})=>z({display:"inherit",marginRight:8,marginLeft:-4},e.size==="small"&&{marginLeft:-2},IR(e))),_q=Fe("span",{name:"MuiButton",slot:"EndIcon",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.endIcon,t[`iconSize${Ne(n.size)}`]]}})(({ownerState:e})=>z({display:"inherit",marginRight:-4,marginLeft:8},e.size==="small"&&{marginRight:-2},IR(e))),Pq=T.exports.forwardRef(function(t,n){const r=T.exports.useContext(Sq),i=bx(r,t),o=Bt({props:i,name:"MuiButton"}),{children:s,color:u="primary",component:c="button",className:f,disabled:p=!1,disableElevation:h=!1,disableFocusRipple:g=!1,endIcon:v,focusVisibleClassName:y,fullWidth:b=!1,size:C="medium",startIcon:x,type:w,variant:S="text"}=o,E=ke(o,kq),I=z({},o,{color:u,component:c,disabled:p,disableElevation:h,disableFocusRipple:g,fullWidth:b,size:C,type:w,variant:S}),_=Cq(I),R=x&&N(Oq,{className:_.startIcon,ownerState:I,children:x}),D=v&&N(_q,{className:_.endIcon,ownerState:I,children:v});return ge(Eq,z({ownerState:I,className:De(r.className,_.root,f),component:c,disabled:p,focusRipple:!g,focusVisibleClassName:De(_.focusVisible,y),ref:n,type:w},E,{classes:_,children:[R,s,D]}))}),Tq=Pq,Iq=["BackdropComponent","BackdropProps","closeAfterTransition","children","component","components","componentsProps","disableAutoFocus","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","slotProps","slots","theme"],Rq=e=>e.classes,Aq=Fe("div",{name:"MuiModal",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,!n.open&&n.exited&&t.hidden]}})(({theme:e,ownerState:t})=>z({position:"fixed",zIndex:(e.vars||e).zIndex.modal,right:0,bottom:0,top:0,left:0},!t.open&&t.exited&&{visibility:"hidden"})),Mq=Fe(TR,{name:"MuiModal",slot:"Backdrop",overridesResolver:(e,t)=>t.backdrop})({zIndex:-1}),$q=T.exports.forwardRef(function(t,n){var r,i,o,s,u,c;const f=Bt({name:"MuiModal",props:t}),{BackdropComponent:p=Mq,BackdropProps:h,closeAfterTransition:g=!1,children:v,component:y,components:b={},componentsProps:C={},disableAutoFocus:x=!1,disableEnforceFocus:w=!1,disableEscapeKeyDown:S=!1,disablePortal:E=!1,disableRestoreFocus:I=!1,disableScrollLock:_=!1,hideBackdrop:R=!1,keepMounted:D=!1,slotProps:W,slots:L,theme:B}=f,Y=ke(f,Iq),[Z,re]=T.exports.useState(!0),te={closeAfterTransition:g,disableAutoFocus:x,disableEnforceFocus:w,disableEscapeKeyDown:S,disablePortal:E,disableRestoreFocus:I,disableScrollLock:_,hideBackdrop:R,keepMounted:D},oe=z({},f,te,{exited:Z}),le=Rq(oe),H=(r=(i=L?.root)!=null?i:b.Root)!=null?r:Aq,Q=(o=(s=L?.backdrop)!=null?s:b.Backdrop)!=null?o:p,K=(u=W?.root)!=null?u:C.root,A=(c=W?.backdrop)!=null?c:C.backdrop;return N(XV,z({slots:{root:H,backdrop:Q},slotProps:{root:()=>z({},fy(K,oe),!pR(H)&&{as:y,theme:B}),backdrop:()=>z({},h,fy(A,oe))},onTransitionEnter:()=>re(!1),onTransitionExited:()=>re(!0),ref:n},Y,{classes:le},te,{children:v}))}),RR=$q;function Dq(e){return tt("MuiDialog",e)}const Nq=ct("MuiDialog",["root","scrollPaper","scrollBody","container","paper","paperScrollPaper","paperScrollBody","paperWidthFalse","paperWidthXs","paperWidthSm","paperWidthMd","paperWidthLg","paperWidthXl","paperFullWidth","paperFullScreen"]),Rv=Nq,Lq=T.exports.createContext({}),AR=Lq,Fq=["aria-describedby","aria-labelledby","BackdropComponent","BackdropProps","children","className","disableEscapeKeyDown","fullScreen","fullWidth","maxWidth","onBackdropClick","onClose","open","PaperComponent","PaperProps","scroll","TransitionComponent","transitionDuration","TransitionProps"],zq=Fe(TR,{name:"MuiDialog",slot:"Backdrop",overrides:(e,t)=>t.backdrop})({zIndex:-1}),Bq=e=>{const{classes:t,scroll:n,maxWidth:r,fullWidth:i,fullScreen:o}=e,s={root:["root"],container:["container",`scroll${Ne(n)}`],paper:["paper",`paperScroll${Ne(n)}`,`paperWidth${Ne(String(r))}`,i&&"paperFullWidth",o&&"paperFullScreen"]};return wt(s,Dq,t)},jq=Fe(RR,{name:"MuiDialog",slot:"Root",overridesResolver:(e,t)=>t.root})({"@media print":{position:"absolute !important"}}),Wq=Fe("div",{name:"MuiDialog",slot:"Container",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.container,t[`scroll${Ne(n.scroll)}`]]}})(({ownerState:e})=>z({height:"100%","@media print":{height:"auto"},outline:0},e.scroll==="paper"&&{display:"flex",justifyContent:"center",alignItems:"center"},e.scroll==="body"&&{overflowY:"auto",overflowX:"hidden",textAlign:"center","&:after":{content:'""',display:"inline-block",verticalAlign:"middle",height:"100%",width:"0"}})),Uq=Fe(Al,{name:"MuiDialog",slot:"Paper",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.paper,t[`scrollPaper${Ne(n.scroll)}`],t[`paperWidth${Ne(String(n.maxWidth))}`],n.fullWidth&&t.paperFullWidth,n.fullScreen&&t.paperFullScreen]}})(({theme:e,ownerState:t})=>z({margin:32,position:"relative",overflowY:"auto","@media print":{overflowY:"visible",boxShadow:"none"}},t.scroll==="paper"&&{display:"flex",flexDirection:"column",maxHeight:"calc(100% - 64px)"},t.scroll==="body"&&{display:"inline-block",verticalAlign:"middle",textAlign:"left"},!t.maxWidth&&{maxWidth:"calc(100% - 64px)"},t.maxWidth==="xs"&&{maxWidth:e.breakpoints.unit==="px"?Math.max(e.breakpoints.values.xs,444):`${e.breakpoints.values.xs}${e.breakpoints.unit}`,[`&.${Rv.paperScrollBody}`]:{[e.breakpoints.down(Math.max(e.breakpoints.values.xs,444)+32*2)]:{maxWidth:"calc(100% - 64px)"}}},t.maxWidth&&t.maxWidth!=="xs"&&{maxWidth:`${e.breakpoints.values[t.maxWidth]}${e.breakpoints.unit}`,[`&.${Rv.paperScrollBody}`]:{[e.breakpoints.down(e.breakpoints.values[t.maxWidth]+32*2)]:{maxWidth:"calc(100% - 64px)"}}},t.fullWidth&&{width:"calc(100% - 64px)"},t.fullScreen&&{margin:0,width:"100%",maxWidth:"100%",height:"100%",maxHeight:"none",borderRadius:0,[`&.${Rv.paperScrollBody}`]:{margin:0,maxWidth:"100%"}})),Hq=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiDialog"}),i=ns(),o={enter:i.transitions.duration.enteringScreen,exit:i.transitions.duration.leavingScreen},{"aria-describedby":s,"aria-labelledby":u,BackdropComponent:c,BackdropProps:f,children:p,className:h,disableEscapeKeyDown:g=!1,fullScreen:v=!1,fullWidth:y=!1,maxWidth:b="sm",onBackdropClick:C,onClose:x,open:w,PaperComponent:S=Al,PaperProps:E={},scroll:I="paper",TransitionComponent:_=dm,transitionDuration:R=o,TransitionProps:D}=r,W=ke(r,Fq),L=z({},r,{disableEscapeKeyDown:g,fullScreen:v,fullWidth:y,maxWidth:b,scroll:I}),B=Bq(L),Y=T.exports.useRef(),Z=le=>{Y.current=le.target===le.currentTarget},re=le=>{!Y.current||(Y.current=null,C&&C(le),x&&x(le,"backdropClick"))},te=vx(u),oe=T.exports.useMemo(()=>({titleId:te}),[te]);return N(jq,z({className:De(B.root,h),closeAfterTransition:!0,components:{Backdrop:zq},componentsProps:{backdrop:z({transitionDuration:R,as:c},f)},disableEscapeKeyDown:g,onClose:x,open:w,ref:n,onClick:re,ownerState:L},W,{children:N(_,z({appear:!0,in:w,timeout:R,role:"presentation"},D,{children:N(Wq,{className:De(B.container),onMouseDown:Z,ownerState:L,children:N(Uq,z({as:S,elevation:24,role:"dialog","aria-describedby":s,"aria-labelledby":te},E,{className:De(B.paper,E.className),ownerState:L,children:N(AR.Provider,{value:oe,children:p})}))})}))}))}),Vq=Hq;function Gq(e){return tt("MuiDialogActions",e)}ct("MuiDialogActions",["root","spacing"]);const qq=["className","disableSpacing"],Yq=e=>{const{classes:t,disableSpacing:n}=e;return wt({root:["root",!n&&"spacing"]},Gq,t)},Kq=Fe("div",{name:"MuiDialogActions",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,!n.disableSpacing&&t.spacing]}})(({ownerState:e})=>z({display:"flex",alignItems:"center",padding:8,justifyContent:"flex-end",flex:"0 0 auto"},!e.disableSpacing&&{"& > :not(:first-of-type)":{marginLeft:8}})),Xq=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiDialogActions"}),{className:i,disableSpacing:o=!1}=r,s=ke(r,qq),u=z({},r,{disableSpacing:o}),c=Yq(u);return N(Kq,z({className:De(c.root,i),ownerState:u,ref:n},s))}),Qq=Xq;function Zq(e){return tt("MuiDialogContent",e)}ct("MuiDialogContent",["root","dividers"]);function Jq(e){return tt("MuiDialogTitle",e)}const eY=ct("MuiDialogTitle",["root"]),tY=eY,nY=["className","dividers"],rY=e=>{const{classes:t,dividers:n}=e;return wt({root:["root",n&&"dividers"]},Zq,t)},iY=Fe("div",{name:"MuiDialogContent",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.dividers&&t.dividers]}})(({theme:e,ownerState:t})=>z({flex:"1 1 auto",WebkitOverflowScrolling:"touch",overflowY:"auto",padding:"20px 24px"},t.dividers?{padding:"16px 24px",borderTop:`1px solid ${(e.vars||e).palette.divider}`,borderBottom:`1px solid ${(e.vars||e).palette.divider}`}:{[`.${tY.root} + &`]:{paddingTop:0}})),oY=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiDialogContent"}),{className:i,dividers:o=!1}=r,s=ke(r,nY),u=z({},r,{dividers:o}),c=rY(u);return N(iY,z({className:De(c.root,i),ownerState:u,ref:n},s))}),aY=oY,sY=["className","id"],lY=e=>{const{classes:t}=e;return wt({root:["root"]},Jq,t)},uY=Fe(_R,{name:"MuiDialogTitle",slot:"Root",overridesResolver:(e,t)=>t.root})({padding:"16px 24px",flex:"0 0 auto"}),cY=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiDialogTitle"}),{className:i,id:o}=r,s=ke(r,sY),u=r,c=lY(u),{titleId:f=o}=T.exports.useContext(AR);return N(uY,z({component:"h2",className:De(c.root,i),ownerState:u,ref:n,variant:"h6",id:f},s))}),fY=cY;function dY(e){return tt("MuiDivider",e)}const pY=ct("MuiDivider",["root","absolute","fullWidth","inset","middle","flexItem","light","vertical","withChildren","withChildrenVertical","textAlignRight","textAlignLeft","wrapper","wrapperVertical"]),AC=pY,hY=["absolute","children","className","component","flexItem","light","orientation","role","textAlign","variant"],mY=e=>{const{absolute:t,children:n,classes:r,flexItem:i,light:o,orientation:s,textAlign:u,variant:c}=e;return wt({root:["root",t&&"absolute",c,o&&"light",s==="vertical"&&"vertical",i&&"flexItem",n&&"withChildren",n&&s==="vertical"&&"withChildrenVertical",u==="right"&&s!=="vertical"&&"textAlignRight",u==="left"&&s!=="vertical"&&"textAlignLeft"],wrapper:["wrapper",s==="vertical"&&"wrapperVertical"]},dY,r)},gY=Fe("div",{name:"MuiDivider",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,n.absolute&&t.absolute,t[n.variant],n.light&&t.light,n.orientation==="vertical"&&t.vertical,n.flexItem&&t.flexItem,n.children&&t.withChildren,n.children&&n.orientation==="vertical"&&t.withChildrenVertical,n.textAlign==="right"&&n.orientation!=="vertical"&&t.textAlignRight,n.textAlign==="left"&&n.orientation!=="vertical"&&t.textAlignLeft]}})(({theme:e,ownerState:t})=>z({margin:0,flexShrink:0,borderWidth:0,borderStyle:"solid",borderColor:(e.vars||e).palette.divider,borderBottomWidth:"thin"},t.absolute&&{position:"absolute",bottom:0,left:0,width:"100%"},t.light&&{borderColor:e.vars?`rgba(${e.vars.palette.dividerChannel} / 0.08)`:yn(e.palette.divider,.08)},t.variant==="inset"&&{marginLeft:72},t.variant==="middle"&&t.orientation==="horizontal"&&{marginLeft:e.spacing(2),marginRight:e.spacing(2)},t.variant==="middle"&&t.orientation==="vertical"&&{marginTop:e.spacing(1),marginBottom:e.spacing(1)},t.orientation==="vertical"&&{height:"100%",borderBottomWidth:0,borderRightWidth:"thin"},t.flexItem&&{alignSelf:"stretch",height:"auto"}),({theme:e,ownerState:t})=>z({},t.children&&{display:"flex",whiteSpace:"nowrap",textAlign:"center",border:0,"&::before, &::after":{position:"relative",width:"100%",borderTop:`thin solid ${(e.vars||e).palette.divider}`,top:"50%",content:'""',transform:"translateY(50%)"}}),({theme:e,ownerState:t})=>z({},t.children&&t.orientation==="vertical"&&{flexDirection:"column","&::before, &::after":{height:"100%",top:"0%",left:"50%",borderTop:0,borderLeft:`thin solid ${(e.vars||e).palette.divider}`,transform:"translateX(0%)"}}),({ownerState:e})=>z({},e.textAlign==="right"&&e.orientation!=="vertical"&&{"&::before":{width:"90%"},"&::after":{width:"10%"}},e.textAlign==="left"&&e.orientation!=="vertical"&&{"&::before":{width:"10%"},"&::after":{width:"90%"}})),vY=Fe("span",{name:"MuiDivider",slot:"Wrapper",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.wrapper,n.orientation==="vertical"&&t.wrapperVertical]}})(({theme:e,ownerState:t})=>z({display:"inline-block",paddingLeft:`calc(${e.spacing(1)} * 1.2)`,paddingRight:`calc(${e.spacing(1)} * 1.2)`},t.orientation==="vertical"&&{paddingTop:`calc(${e.spacing(1)} * 1.2)`,paddingBottom:`calc(${e.spacing(1)} * 1.2)`})),yY=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiDivider"}),{absolute:i=!1,children:o,className:s,component:u=o?"div":"hr",flexItem:c=!1,light:f=!1,orientation:p="horizontal",role:h=u!=="hr"?"separator":void 0,textAlign:g="center",variant:v="fullWidth"}=r,y=ke(r,hY),b=z({},r,{absolute:i,component:u,flexItem:c,light:f,orientation:p,role:h,textAlign:g,variant:v}),C=mY(b);return N(gY,z({as:u,className:De(C.root,s),role:h,ref:n,ownerState:b},y,{children:o?N(vY,{className:C.wrapper,ownerState:b,children:o}):null}))}),nc=yY,xY=["addEndListener","appear","children","container","direction","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"];function bY(e,t,n){const r=t.getBoundingClientRect(),i=n&&n.getBoundingClientRect(),o=Zo(t);let s;if(t.fakeTransform)s=t.fakeTransform;else{const f=o.getComputedStyle(t);s=f.getPropertyValue("-webkit-transform")||f.getPropertyValue("transform")}let u=0,c=0;if(s&&s!=="none"&&typeof s=="string"){const f=s.split("(")[1].split(")")[0].split(",");u=parseInt(f[4],10),c=parseInt(f[5],10)}return e==="left"?i?`translateX(${i.right+u-r.left}px)`:`translateX(${o.innerWidth+u-r.left}px)`:e==="right"?i?`translateX(-${r.right-i.left-u}px)`:`translateX(-${r.left+r.width-u}px)`:e==="up"?i?`translateY(${i.bottom+c-r.top}px)`:`translateY(${o.innerHeight+c-r.top}px)`:i?`translateY(-${r.top-i.top+r.height-c}px)`:`translateY(-${r.top+r.height-c}px)`}function wY(e){return typeof e=="function"?e():e}function Ed(e,t,n){const r=wY(n),i=bY(e,t,r);i&&(t.style.webkitTransform=i,t.style.transform=i)}const SY=T.exports.forwardRef(function(t,n){const r=ns(),i={enter:r.transitions.easing.easeOut,exit:r.transitions.easing.sharp},o={enter:r.transitions.duration.enteringScreen,exit:r.transitions.duration.leavingScreen},{addEndListener:s,appear:u=!0,children:c,container:f,direction:p="down",easing:h=i,in:g,onEnter:v,onEntered:y,onEntering:b,onExit:C,onExited:x,onExiting:w,style:S,timeout:E=o,TransitionComponent:I=nb}=t,_=ke(t,xY),R=T.exports.useRef(null),D=Sn(c.ref,R,n),W=H=>Q=>{H&&(Q===void 0?H(R.current):H(R.current,Q))},L=W((H,Q)=>{Ed(p,H,f),ob(H),v&&v(H,Q)}),B=W((H,Q)=>{const K=wl({timeout:E,style:S,easing:h},{mode:"enter"});H.style.webkitTransition=r.transitions.create("-webkit-transform",z({},K)),H.style.transition=r.transitions.create("transform",z({},K)),H.style.webkitTransform="none",H.style.transform="none",b&&b(H,Q)}),Y=W(y),Z=W(w),re=W(H=>{const Q=wl({timeout:E,style:S,easing:h},{mode:"exit"});H.style.webkitTransition=r.transitions.create("-webkit-transform",Q),H.style.transition=r.transitions.create("transform",Q),Ed(p,H,f),C&&C(H)}),te=W(H=>{H.style.webkitTransition="",H.style.transition="",x&&x(H)}),oe=H=>{s&&s(R.current,H)},le=T.exports.useCallback(()=>{R.current&&Ed(p,R.current,f)},[p,f]);return T.exports.useEffect(()=>{if(g||p==="down"||p==="right")return;const H=gx(()=>{R.current&&Ed(p,R.current,f)}),Q=Zo(R.current);return Q.addEventListener("resize",H),()=>{H.clear(),Q.removeEventListener("resize",H)}},[p,g,f]),T.exports.useEffect(()=>{g||le()},[g,le]),N(I,z({nodeRef:R,onEnter:L,onEntered:Y,onEntering:B,onExit:re,onExited:te,onExiting:Z,addEndListener:oe,appear:u,in:g,timeout:E},_,{children:(H,Q)=>T.exports.cloneElement(c,z({ref:D,style:z({visibility:H==="exited"&&!g?"hidden":void 0},S,c.props.style)},Q))}))}),MR=SY,kY=["addEndListener","appear","children","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"];function xy(e){return`scale(${e}, ${e**2})`}const CY={entering:{opacity:1,transform:xy(1)},entered:{opacity:1,transform:"none"}},Av=typeof navigator<"u"&&/^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent)&&/(os |version\/)15(.|_)4/i.test(navigator.userAgent),$R=T.exports.forwardRef(function(t,n){const{addEndListener:r,appear:i=!0,children:o,easing:s,in:u,onEnter:c,onEntered:f,onEntering:p,onExit:h,onExited:g,onExiting:v,style:y,timeout:b="auto",TransitionComponent:C=nb}=t,x=ke(t,kY),w=T.exports.useRef(),S=T.exports.useRef(),E=ns(),I=T.exports.useRef(null),_=Sn(I,o.ref,n),R=te=>oe=>{if(te){const le=I.current;oe===void 0?te(le):te(le,oe)}},D=R(p),W=R((te,oe)=>{ob(te);const{duration:le,delay:H,easing:Q}=wl({style:y,timeout:b,easing:s},{mode:"enter"});let K;b==="auto"?(K=E.transitions.getAutoHeightDuration(te.clientHeight),S.current=K):K=le,te.style.transition=[E.transitions.create("opacity",{duration:K,delay:H}),E.transitions.create("transform",{duration:Av?K:K*.666,delay:H,easing:Q})].join(","),c&&c(te,oe)}),L=R(f),B=R(v),Y=R(te=>{const{duration:oe,delay:le,easing:H}=wl({style:y,timeout:b,easing:s},{mode:"exit"});let Q;b==="auto"?(Q=E.transitions.getAutoHeightDuration(te.clientHeight),S.current=Q):Q=oe,te.style.transition=[E.transitions.create("opacity",{duration:Q,delay:le}),E.transitions.create("transform",{duration:Av?Q:Q*.666,delay:Av?le:le||Q*.333,easing:H})].join(","),te.style.opacity=0,te.style.transform=xy(.75),h&&h(te)}),Z=R(g),re=te=>{b==="auto"&&(w.current=setTimeout(te,S.current||0)),r&&r(I.current,te)};return T.exports.useEffect(()=>()=>{clearTimeout(w.current)},[]),N(C,z({appear:i,in:u,nodeRef:I,onEnter:W,onEntered:L,onEntering:D,onExit:Y,onExited:Z,onExiting:B,addEndListener:re,timeout:b==="auto"?null:b},x,{children:(te,oe)=>T.exports.cloneElement(o,z({style:z({opacity:0,transform:xy(.75),visibility:te==="exited"&&!u?"hidden":void 0},CY[te],y,o.props.style),ref:_},oe))}))});$R.muiSupportAuto=!0;const Jp=$R,EY=T.exports.createContext({}),by=EY;function OY(e){return tt("MuiList",e)}ct("MuiList",["root","padding","dense","subheader"]);const _Y=["children","className","component","dense","disablePadding","subheader"],PY=e=>{const{classes:t,disablePadding:n,dense:r,subheader:i}=e;return wt({root:["root",!n&&"padding",r&&"dense",i&&"subheader"]},OY,t)},TY=Fe("ul",{name:"MuiList",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,!n.disablePadding&&t.padding,n.dense&&t.dense,n.subheader&&t.subheader]}})(({ownerState:e})=>z({listStyle:"none",margin:0,padding:0,position:"relative"},!e.disablePadding&&{paddingTop:8,paddingBottom:8},e.subheader&&{paddingTop:0})),IY=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiList"}),{children:i,className:o,component:s="ul",dense:u=!1,disablePadding:c=!1,subheader:f}=r,p=ke(r,_Y),h=T.exports.useMemo(()=>({dense:u}),[u]),g=z({},r,{component:s,dense:u,disablePadding:c}),v=PY(g);return N(by.Provider,{value:h,children:ge(TY,z({as:s,className:De(v.root,o),ref:n,ownerState:g},p,{children:[f,i]}))})}),RY=IY,AY=ct("MuiListItemIcon",["root","alignItemsFlexStart"]),MC=AY,MY=ct("MuiListItemText",["root","multiline","dense","inset","primary","secondary"]),$C=MY,$Y=["actions","autoFocus","autoFocusItem","children","className","disabledItemsFocusable","disableListWrap","onKeyDown","variant"];function Mv(e,t,n){return e===t?e.firstChild:t&&t.nextElementSibling?t.nextElementSibling:n?null:e.firstChild}function DC(e,t,n){return e===t?n?e.firstChild:e.lastChild:t&&t.previousElementSibling?t.previousElementSibling:n?null:e.lastChild}function DR(e,t){if(t===void 0)return!0;let n=e.innerText;return n===void 0&&(n=e.textContent),n=n.trim().toLowerCase(),n.length===0?!1:t.repeating?n[0]===t.keys[0]:n.indexOf(t.keys.join(""))===0}function yu(e,t,n,r,i,o){let s=!1,u=i(e,t,t?n:!1);for(;u;){if(u===e.firstChild){if(s)return!1;s=!0}const c=r?!1:u.disabled||u.getAttribute("aria-disabled")==="true";if(!u.hasAttribute("tabindex")||!DR(u,o)||c)u=i(e,u,n);else return u.focus(),!0}return!1}const DY=T.exports.forwardRef(function(t,n){const{actions:r,autoFocus:i=!1,autoFocusItem:o=!1,children:s,className:u,disabledItemsFocusable:c=!1,disableListWrap:f=!1,onKeyDown:p,variant:h="selectedMenu"}=t,g=ke(t,$Y),v=T.exports.useRef(null),y=T.exports.useRef({keys:[],repeating:!0,previousKeyMatched:!0,lastTime:null});Jo(()=>{i&&v.current.focus()},[i]),T.exports.useImperativeHandle(r,()=>({adjustStyleForScrollbar:(S,E)=>{const I=!v.current.style.width;if(S.clientHeight{const E=v.current,I=S.key,_=bn(E).activeElement;if(I==="ArrowDown")S.preventDefault(),yu(E,_,f,c,Mv);else if(I==="ArrowUp")S.preventDefault(),yu(E,_,f,c,DC);else if(I==="Home")S.preventDefault(),yu(E,null,f,c,Mv);else if(I==="End")S.preventDefault(),yu(E,null,f,c,DC);else if(I.length===1){const R=y.current,D=I.toLowerCase(),W=performance.now();R.keys.length>0&&(W-R.lastTime>500?(R.keys=[],R.repeating=!0,R.previousKeyMatched=!0):R.repeating&&D!==R.keys[0]&&(R.repeating=!1)),R.lastTime=W,R.keys.push(D);const L=_&&!R.repeating&&DR(_,R);R.previousKeyMatched&&(L||yu(E,_,!1,c,Mv,R))?S.preventDefault():R.previousKeyMatched=!1}p&&p(S)},C=Sn(v,n);let x=-1;T.exports.Children.forEach(s,(S,E)=>{!T.exports.isValidElement(S)||S.props.disabled||(h==="selectedMenu"&&S.props.selected||x===-1)&&(x=E)});const w=T.exports.Children.map(s,(S,E)=>{if(E===x){const I={};return o&&(I.autoFocus=!0),S.props.tabIndex===void 0&&h==="selectedMenu"&&(I.tabIndex=0),T.exports.cloneElement(S,I)}return S});return N(RY,z({role:"menu",ref:C,className:u,onKeyDown:b,tabIndex:i?0:-1},g,{children:w}))}),NY=DY;function LY(e){return tt("MuiPopover",e)}ct("MuiPopover",["root","paper"]);const FY=["onEntering"],zY=["action","anchorEl","anchorOrigin","anchorPosition","anchorReference","children","className","container","elevation","marginThreshold","open","PaperProps","transformOrigin","TransitionComponent","transitionDuration","TransitionProps"];function NC(e,t){let n=0;return typeof t=="number"?n=t:t==="center"?n=e.height/2:t==="bottom"&&(n=e.height),n}function LC(e,t){let n=0;return typeof t=="number"?n=t:t==="center"?n=e.width/2:t==="right"&&(n=e.width),n}function FC(e){return[e.horizontal,e.vertical].map(t=>typeof t=="number"?`${t}px`:t).join(" ")}function $v(e){return typeof e=="function"?e():e}const BY=e=>{const{classes:t}=e;return wt({root:["root"],paper:["paper"]},LY,t)},jY=Fe(RR,{name:"MuiPopover",slot:"Root",overridesResolver:(e,t)=>t.root})({}),WY=Fe(Al,{name:"MuiPopover",slot:"Paper",overridesResolver:(e,t)=>t.paper})({position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}),UY=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiPopover"}),{action:i,anchorEl:o,anchorOrigin:s={vertical:"top",horizontal:"left"},anchorPosition:u,anchorReference:c="anchorEl",children:f,className:p,container:h,elevation:g=8,marginThreshold:v=16,open:y,PaperProps:b={},transformOrigin:C={vertical:"top",horizontal:"left"},TransitionComponent:x=Jp,transitionDuration:w="auto",TransitionProps:{onEntering:S}={}}=r,E=ke(r.TransitionProps,FY),I=ke(r,zY),_=T.exports.useRef(),R=Sn(_,b.ref),D=z({},r,{anchorOrigin:s,anchorReference:c,elevation:g,marginThreshold:v,PaperProps:b,transformOrigin:C,TransitionComponent:x,transitionDuration:w,TransitionProps:E}),W=BY(D),L=T.exports.useCallback(()=>{if(c==="anchorPosition")return u;const K=$v(o),M=(K&&K.nodeType===1?K:bn(_.current).body).getBoundingClientRect();return{top:M.top+NC(M,s.vertical),left:M.left+LC(M,s.horizontal)}},[o,s.horizontal,s.vertical,u,c]),B=T.exports.useCallback(K=>({vertical:NC(K,C.vertical),horizontal:LC(K,C.horizontal)}),[C.horizontal,C.vertical]),Y=T.exports.useCallback(K=>{const A={width:K.offsetWidth,height:K.offsetHeight},M=B(A);if(c==="none")return{top:null,left:null,transformOrigin:FC(M)};const we=L();let xe=we.top-M.vertical,Se=we.left-M.horizontal;const me=xe+A.height,Ae=Se+A.width,Pe=Zo($v(o)),de=Pe.innerHeight-v,We=Pe.innerWidth-v;if(xede){const Ie=me-de;xe-=Ie,M.vertical+=Ie}if(SeWe){const Ie=Ae-We;Se-=Ie,M.horizontal+=Ie}return{top:`${Math.round(xe)}px`,left:`${Math.round(Se)}px`,transformOrigin:FC(M)}},[o,c,L,B,v]),[Z,re]=T.exports.useState(y),te=T.exports.useCallback(()=>{const K=_.current;if(!K)return;const A=Y(K);A.top!==null&&(K.style.top=A.top),A.left!==null&&(K.style.left=A.left),K.style.transformOrigin=A.transformOrigin,re(!0)},[Y]),oe=(K,A)=>{S&&S(K,A),te()},le=()=>{re(!1)};T.exports.useEffect(()=>{y&&te()}),T.exports.useImperativeHandle(i,()=>y?{updatePosition:()=>{te()}}:null,[y,te]),T.exports.useEffect(()=>{if(!y)return;const K=gx(()=>{te()}),A=Zo(o);return A.addEventListener("resize",K),()=>{K.clear(),A.removeEventListener("resize",K)}},[o,y,te]);let H=w;w==="auto"&&!x.muiSupportAuto&&(H=void 0);const Q=h||(o?bn($v(o)).body:void 0);return N(jY,z({BackdropProps:{invisible:!0},className:De(W.root,p),container:Q,open:y,ref:n,ownerState:D},I,{children:N(x,z({appear:!0,in:y,onEntering:oe,onExited:le,timeout:H},E,{children:N(WY,z({elevation:g},b,{ref:R,className:De(W.paper,b.className)},Z?void 0:{style:z({},b.style,{opacity:0})},{ownerState:D,children:f}))}))}))}),HY=UY;function VY(e){return tt("MuiMenu",e)}ct("MuiMenu",["root","paper","list"]);const GY=["onEntering"],qY=["autoFocus","children","disableAutoFocusItem","MenuListProps","onClose","open","PaperProps","PopoverClasses","transitionDuration","TransitionProps","variant"],YY={vertical:"top",horizontal:"right"},KY={vertical:"top",horizontal:"left"},XY=e=>{const{classes:t}=e;return wt({root:["root"],paper:["paper"],list:["list"]},VY,t)},QY=Fe(HY,{shouldForwardProp:e=>um(e)||e==="classes",name:"MuiMenu",slot:"Root",overridesResolver:(e,t)=>t.root})({}),ZY=Fe(Al,{name:"MuiMenu",slot:"Paper",overridesResolver:(e,t)=>t.paper})({maxHeight:"calc(100% - 96px)",WebkitOverflowScrolling:"touch"}),JY=Fe(NY,{name:"MuiMenu",slot:"List",overridesResolver:(e,t)=>t.list})({outline:0}),eK=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiMenu"}),{autoFocus:i=!0,children:o,disableAutoFocusItem:s=!1,MenuListProps:u={},onClose:c,open:f,PaperProps:p={},PopoverClasses:h,transitionDuration:g="auto",TransitionProps:{onEntering:v}={},variant:y="selectedMenu"}=r,b=ke(r.TransitionProps,GY),C=ke(r,qY),x=ns(),w=x.direction==="rtl",S=z({},r,{autoFocus:i,disableAutoFocusItem:s,MenuListProps:u,onEntering:v,PaperProps:p,transitionDuration:g,TransitionProps:b,variant:y}),E=XY(S),I=i&&!s&&f,_=T.exports.useRef(null),R=(L,B)=>{_.current&&_.current.adjustStyleForScrollbar(L,x),v&&v(L,B)},D=L=>{L.key==="Tab"&&(L.preventDefault(),c&&c(L,"tabKeyDown"))};let W=-1;return T.exports.Children.map(o,(L,B)=>{!T.exports.isValidElement(L)||L.props.disabled||(y==="selectedMenu"&&L.props.selected||W===-1)&&(W=B)}),N(QY,z({classes:h,onClose:c,anchorOrigin:{vertical:"bottom",horizontal:w?"right":"left"},transformOrigin:w?YY:KY,PaperProps:z({component:ZY},p,{classes:z({},p.classes,{root:E.paper})}),className:E.root,open:f,ref:n,transitionDuration:g,TransitionProps:z({onEntering:R},b),ownerState:S},C,{children:N(JY,z({onKeyDown:D,actions:_,autoFocus:i&&(W===-1||s),autoFocusItem:I,variant:y},u,{className:De(E.list,u.className),children:o}))}))}),pm=eK;function tK(e){return tt("MuiMenuItem",e)}const nK=ct("MuiMenuItem",["root","focusVisible","dense","disabled","divider","gutters","selected"]),xu=nK,rK=["autoFocus","component","dense","divider","disableGutters","focusVisibleClassName","role","tabIndex","className"],iK=(e,t)=>{const{ownerState:n}=e;return[t.root,n.dense&&t.dense,n.divider&&t.divider,!n.disableGutters&&t.gutters]},oK=e=>{const{disabled:t,dense:n,divider:r,disableGutters:i,selected:o,classes:s}=e,c=wt({root:["root",n&&"dense",t&&"disabled",!i&&"gutters",r&&"divider",o&&"selected"]},tK,s);return z({},s,c)},aK=Fe(ab,{shouldForwardProp:e=>um(e)||e==="classes",name:"MuiMenuItem",slot:"Root",overridesResolver:iK})(({theme:e,ownerState:t})=>z({},e.typography.body1,{display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",minHeight:48,paddingTop:6,paddingBottom:6,boxSizing:"border-box",whiteSpace:"nowrap"},!t.disableGutters&&{paddingLeft:16,paddingRight:16},t.divider&&{borderBottom:`1px solid ${(e.vars||e).palette.divider}`,backgroundClip:"padding-box"},{"&:hover":{textDecoration:"none",backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${xu.selected}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / ${e.vars.palette.action.selectedOpacity})`:yn(e.palette.primary.main,e.palette.action.selectedOpacity),[`&.${xu.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:yn(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)}},[`&.${xu.selected}:hover`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:yn(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / ${e.vars.palette.action.selectedOpacity})`:yn(e.palette.primary.main,e.palette.action.selectedOpacity)}},[`&.${xu.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`&.${xu.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity},[`& + .${AC.root}`]:{marginTop:e.spacing(1),marginBottom:e.spacing(1)},[`& + .${AC.inset}`]:{marginLeft:52},[`& .${$C.root}`]:{marginTop:0,marginBottom:0},[`& .${$C.inset}`]:{paddingLeft:36},[`& .${MC.root}`]:{minWidth:36}},!t.dense&&{[e.breakpoints.up("sm")]:{minHeight:"auto"}},t.dense&&z({minHeight:32,paddingTop:4,paddingBottom:4},e.typography.body2,{[`& .${MC.root} svg`]:{fontSize:"1.25rem"}}))),sK=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiMenuItem"}),{autoFocus:i=!1,component:o="li",dense:s=!1,divider:u=!1,disableGutters:c=!1,focusVisibleClassName:f,role:p="menuitem",tabIndex:h,className:g}=r,v=ke(r,rK),y=T.exports.useContext(by),b=T.exports.useMemo(()=>({dense:s||y.dense||!1,disableGutters:c}),[y.dense,s,c]),C=T.exports.useRef(null);Jo(()=>{i&&C.current&&C.current.focus()},[i]);const x=z({},r,{dense:b.dense,divider:u,disableGutters:c}),w=oK(r),S=Sn(C,n);let E;return r.disabled||(E=h!==void 0?h:-1),N(by.Provider,{value:b,children:N(aK,z({ref:S,role:p,tabIndex:E,component:o,focusVisibleClassName:De(w.focusVisible,f),className:De(w.root,g)},v,{ownerState:x,classes:w}))})}),Vi=sK;function lK(e){return tt("MuiSnackbarContent",e)}ct("MuiSnackbarContent",["root","message","action"]);const uK=["action","className","message","role"],cK=e=>{const{classes:t}=e;return wt({root:["root"],action:["action"],message:["message"]},lK,t)},fK=Fe(Al,{name:"MuiSnackbarContent",slot:"Root",overridesResolver:(e,t)=>t.root})(({theme:e})=>{const t=e.palette.mode==="light"?.8:.98,n=aR(e.palette.background.default,t);return z({},e.typography.body2,{color:e.vars?e.vars.palette.SnackbarContent.color:e.palette.getContrastText(n),backgroundColor:e.vars?e.vars.palette.SnackbarContent.bg:n,display:"flex",alignItems:"center",flexWrap:"wrap",padding:"6px 16px",borderRadius:(e.vars||e).shape.borderRadius,flexGrow:1,[e.breakpoints.up("sm")]:{flexGrow:"initial",minWidth:288}})}),dK=Fe("div",{name:"MuiSnackbarContent",slot:"Message",overridesResolver:(e,t)=>t.message})({padding:"8px 0"}),pK=Fe("div",{name:"MuiSnackbarContent",slot:"Action",overridesResolver:(e,t)=>t.action})({display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}),hK=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiSnackbarContent"}),{action:i,className:o,message:s,role:u="alert"}=r,c=ke(r,uK),f=r,p=cK(f);return ge(fK,z({role:u,square:!0,elevation:6,className:De(p.root,o),ownerState:f,ref:n},c,{children:[N(dK,{className:p.message,ownerState:f,children:s}),i?N(pK,{className:p.action,ownerState:f,children:i}):null]}))}),mK=hK;function gK(e){return tt("MuiSnackbar",e)}ct("MuiSnackbar",["root","anchorOriginTopCenter","anchorOriginBottomCenter","anchorOriginTopRight","anchorOriginBottomRight","anchorOriginTopLeft","anchorOriginBottomLeft"]);const vK=["onEnter","onExited"],yK=["action","anchorOrigin","autoHideDuration","children","className","ClickAwayListenerProps","ContentProps","disableWindowBlurListener","message","onBlur","onClose","onFocus","onMouseEnter","onMouseLeave","open","resumeHideDuration","TransitionComponent","transitionDuration","TransitionProps"],xK=e=>{const{classes:t,anchorOrigin:n}=e,r={root:["root",`anchorOrigin${Ne(n.vertical)}${Ne(n.horizontal)}`]};return wt(r,gK,t)},bK=Fe("div",{name:"MuiSnackbar",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[`anchorOrigin${Ne(n.anchorOrigin.vertical)}${Ne(n.anchorOrigin.horizontal)}`]]}})(({theme:e,ownerState:t})=>{const n={left:"50%",right:"auto",transform:"translateX(-50%)"};return z({zIndex:(e.vars||e).zIndex.snackbar,position:"fixed",display:"flex",left:8,right:8,justifyContent:"center",alignItems:"center"},t.anchorOrigin.vertical==="top"?{top:8}:{bottom:8},t.anchorOrigin.horizontal==="left"&&{justifyContent:"flex-start"},t.anchorOrigin.horizontal==="right"&&{justifyContent:"flex-end"},{[e.breakpoints.up("sm")]:z({},t.anchorOrigin.vertical==="top"?{top:24}:{bottom:24},t.anchorOrigin.horizontal==="center"&&n,t.anchorOrigin.horizontal==="left"&&{left:24,right:"auto"},t.anchorOrigin.horizontal==="right"&&{right:24,left:"auto"})})}),wK=T.exports.forwardRef(function(t,n){const r=Bt({props:t,name:"MuiSnackbar"}),i=ns(),o={enter:i.transitions.duration.enteringScreen,exit:i.transitions.duration.leavingScreen},{action:s,anchorOrigin:{vertical:u,horizontal:c}={vertical:"bottom",horizontal:"left"},autoHideDuration:f=null,children:p,className:h,ClickAwayListenerProps:g,ContentProps:v,disableWindowBlurListener:y=!1,message:b,onBlur:C,onClose:x,onFocus:w,onMouseEnter:S,onMouseLeave:E,open:I,resumeHideDuration:_,TransitionComponent:R=Jp,transitionDuration:D=o,TransitionProps:{onEnter:W,onExited:L}={}}=r,B=ke(r.TransitionProps,vK),Y=ke(r,yK),Z=z({},r,{anchorOrigin:{vertical:u,horizontal:c}}),re=xK(Z),te=T.exports.useRef(),[oe,le]=T.exports.useState(!0),H=ui((...de)=>{x&&x(...de)}),Q=ui(de=>{!x||de==null||(clearTimeout(te.current),te.current=setTimeout(()=>{H(null,"timeout")},de))});T.exports.useEffect(()=>(I&&Q(f),()=>{clearTimeout(te.current)}),[I,f,Q]);const K=()=>{clearTimeout(te.current)},A=T.exports.useCallback(()=>{f!=null&&Q(_??f*.5)},[f,_,Q]),M=de=>{w&&w(de),K()},we=de=>{S&&S(de),K()},xe=de=>{C&&C(de),A()},Se=de=>{E&&E(de),A()},me=de=>{x&&x(de,"clickaway")},Ae=de=>{le(!0),L&&L(de)},Pe=(de,We)=>{le(!1),W&&W(de,We)};return T.exports.useEffect(()=>{if(!y&&I)return window.addEventListener("focus",A),window.addEventListener("blur",K),()=>{window.removeEventListener("focus",A),window.removeEventListener("blur",K)}},[y,A,I]),T.exports.useEffect(()=>{if(!I)return;function de(We){We.defaultPrevented||(We.key==="Escape"||We.key==="Esc")&&x&&x(We,"escapeKeyDown")}return document.addEventListener("keydown",de),()=>{document.removeEventListener("keydown",de)}},[oe,I,x]),!I&&oe?null:N(pH,z({onClickAway:me},g,{children:N(bK,z({className:De(re.root,h),onBlur:xe,onFocus:M,onMouseEnter:we,onMouseLeave:Se,ownerState:Z,ref:n,role:"presentation"},Y,{children:N(R,z({appear:!0,in:I,timeout:D,direction:u==="top"?"down":"up",onEnter:Pe,onExited:Ae},B,{children:p||N(mK,z({message:b,action:s},v))}))}))}))}),SK=wK;function kK(e){return tt("MuiTooltip",e)}const CK=ct("MuiTooltip",["popper","popperInteractive","popperArrow","popperClose","tooltip","tooltipArrow","touch","tooltipPlacementLeft","tooltipPlacementRight","tooltipPlacementTop","tooltipPlacementBottom","arrow"]),$o=CK,EK=["arrow","children","classes","components","componentsProps","describeChild","disableFocusListener","disableHoverListener","disableInteractive","disableTouchListener","enterDelay","enterNextDelay","enterTouchDelay","followCursor","id","leaveDelay","leaveTouchDelay","onClose","onOpen","open","placement","PopperComponent","PopperProps","slotProps","slots","title","TransitionComponent","TransitionProps"];function OK(e){return Math.round(e*1e5)/1e5}const _K=e=>{const{classes:t,disableInteractive:n,arrow:r,touch:i,placement:o}=e,s={popper:["popper",!n&&"popperInteractive",r&&"popperArrow"],tooltip:["tooltip",r&&"tooltipArrow",i&&"touch",`tooltipPlacement${Ne(o.split("-")[0])}`],arrow:["arrow"]};return wt(s,kK,t)},PK=Fe(PR,{name:"MuiTooltip",slot:"Popper",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.popper,!n.disableInteractive&&t.popperInteractive,n.arrow&&t.popperArrow,!n.open&&t.popperClose]}})(({theme:e,ownerState:t,open:n})=>z({zIndex:(e.vars||e).zIndex.tooltip,pointerEvents:"none"},!t.disableInteractive&&{pointerEvents:"auto"},!n&&{pointerEvents:"none"},t.arrow&&{[`&[data-popper-placement*="bottom"] .${$o.arrow}`]:{top:0,marginTop:"-0.71em","&::before":{transformOrigin:"0 100%"}},[`&[data-popper-placement*="top"] .${$o.arrow}`]:{bottom:0,marginBottom:"-0.71em","&::before":{transformOrigin:"100% 0"}},[`&[data-popper-placement*="right"] .${$o.arrow}`]:z({},t.isRtl?{right:0,marginRight:"-0.71em"}:{left:0,marginLeft:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"100% 100%"}}),[`&[data-popper-placement*="left"] .${$o.arrow}`]:z({},t.isRtl?{left:0,marginLeft:"-0.71em"}:{right:0,marginRight:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"0 0"}})})),TK=Fe("div",{name:"MuiTooltip",slot:"Tooltip",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.tooltip,n.touch&&t.touch,n.arrow&&t.tooltipArrow,t[`tooltipPlacement${Ne(n.placement.split("-")[0])}`]]}})(({theme:e,ownerState:t})=>z({backgroundColor:e.vars?e.vars.palette.Tooltip.bg:yn(e.palette.grey[700],.92),borderRadius:(e.vars||e).shape.borderRadius,color:(e.vars||e).palette.common.white,fontFamily:e.typography.fontFamily,padding:"4px 8px",fontSize:e.typography.pxToRem(11),maxWidth:300,margin:2,wordWrap:"break-word",fontWeight:e.typography.fontWeightMedium},t.arrow&&{position:"relative",margin:0},t.touch&&{padding:"8px 16px",fontSize:e.typography.pxToRem(14),lineHeight:`${OK(16/14)}em`,fontWeight:e.typography.fontWeightRegular},{[`.${$o.popper}[data-popper-placement*="left"] &`]:z({transformOrigin:"right center"},t.isRtl?z({marginLeft:"14px"},t.touch&&{marginLeft:"24px"}):z({marginRight:"14px"},t.touch&&{marginRight:"24px"})),[`.${$o.popper}[data-popper-placement*="right"] &`]:z({transformOrigin:"left center"},t.isRtl?z({marginRight:"14px"},t.touch&&{marginRight:"24px"}):z({marginLeft:"14px"},t.touch&&{marginLeft:"24px"})),[`.${$o.popper}[data-popper-placement*="top"] &`]:z({transformOrigin:"center bottom",marginBottom:"14px"},t.touch&&{marginBottom:"24px"}),[`.${$o.popper}[data-popper-placement*="bottom"] &`]:z({transformOrigin:"center top",marginTop:"14px"},t.touch&&{marginTop:"24px"})})),IK=Fe("span",{name:"MuiTooltip",slot:"Arrow",overridesResolver:(e,t)=>t.arrow})(({theme:e})=>({overflow:"hidden",position:"absolute",width:"1em",height:"0.71em",boxSizing:"border-box",color:e.vars?e.vars.palette.Tooltip.bg:yn(e.palette.grey[700],.9),"&::before":{content:'""',margin:"auto",display:"block",width:"100%",height:"100%",backgroundColor:"currentColor",transform:"rotate(45deg)"}}));let Od=!1,Dv=null;function _d(e,t){return n=>{t&&t(n),e(n)}}const RK=T.exports.forwardRef(function(t,n){var r,i,o,s,u,c,f,p,h,g,v,y,b,C,x,w,S,E,I;const _=Bt({props:t,name:"MuiTooltip"}),{arrow:R=!1,children:D,components:W={},componentsProps:L={},describeChild:B=!1,disableFocusListener:Y=!1,disableHoverListener:Z=!1,disableInteractive:re=!1,disableTouchListener:te=!1,enterDelay:oe=100,enterNextDelay:le=0,enterTouchDelay:H=700,followCursor:Q=!1,id:K,leaveDelay:A=0,leaveTouchDelay:M=1500,onClose:we,onOpen:xe,open:Se,placement:me="bottom",PopperComponent:Ae,PopperProps:Pe={},slotProps:de={},slots:We={},title:Ie,TransitionComponent:qt=Jp,TransitionProps:Yt}=_,it=ke(_,EK),dt=ns(),kn=dt.direction==="rtl",[pt,ot]=T.exports.useState(),[Wn,Ze]=T.exports.useState(null),Qe=T.exports.useRef(!1),Kt=re||Q,ln=T.exports.useRef(),Xt=T.exports.useRef(),ht=T.exports.useRef(),Dt=T.exports.useRef(),[vt,V]=$T({controlled:Se,default:!1,name:"Tooltip",state:"open"});let q=vt;const be=vx(K),Ce=T.exports.useRef(),ft=T.exports.useCallback(()=>{Ce.current!==void 0&&(document.body.style.WebkitUserSelect=Ce.current,Ce.current=void 0),clearTimeout(Dt.current)},[]);T.exports.useEffect(()=>()=>{clearTimeout(ln.current),clearTimeout(Xt.current),clearTimeout(ht.current),ft()},[ft]);const nr=Ue=>{clearTimeout(Dv),Od=!0,V(!0),xe&&!q&&xe(Ue)},Ke=ui(Ue=>{clearTimeout(Dv),Dv=setTimeout(()=>{Od=!1},800+A),V(!1),we&&q&&we(Ue),clearTimeout(ln.current),ln.current=setTimeout(()=>{Qe.current=!1},dt.transitions.duration.shortest)}),St=Ue=>{Qe.current&&Ue.type!=="touchstart"||(pt&&pt.removeAttribute("title"),clearTimeout(Xt.current),clearTimeout(ht.current),oe||Od&&le?Xt.current=setTimeout(()=>{nr(Ue)},Od?le:oe):nr(Ue))},rr=Ue=>{clearTimeout(Xt.current),clearTimeout(ht.current),ht.current=setTimeout(()=>{Ke(Ue)},A)},{isFocusVisibleRef:Or,onBlur:kt,onFocus:ca,ref:ir}=yx(),[,Ll]=T.exports.useState(!1),Fl=Ue=>{kt(Ue),Or.current===!1&&(Ll(!1),rr(Ue))},uf=Ue=>{pt||ot(Ue.currentTarget),ca(Ue),Or.current===!0&&(Ll(!0),St(Ue))},cf=Ue=>{Qe.current=!0;const un=D.props;un.onTouchStart&&un.onTouchStart(Ue)},ff=St,df=rr,pf=Ue=>{cf(Ue),clearTimeout(ht.current),clearTimeout(ln.current),ft(),Ce.current=document.body.style.WebkitUserSelect,document.body.style.WebkitUserSelect="none",Dt.current=setTimeout(()=>{document.body.style.WebkitUserSelect=Ce.current,St(Ue)},H)},Cm=Ue=>{D.props.onTouchEnd&&D.props.onTouchEnd(Ue),ft(),clearTimeout(ht.current),ht.current=setTimeout(()=>{Ke(Ue)},M)};T.exports.useEffect(()=>{if(!q)return;function Ue(un){(un.key==="Escape"||un.key==="Esc")&&Ke(un)}return document.addEventListener("keydown",Ue),()=>{document.removeEventListener("keydown",Ue)}},[Ke,q]);const Em=Sn(D.ref,ir,ot,n);!Ie&&Ie!==0&&(q=!1);const fa=T.exports.useRef({x:0,y:0}),da=T.exports.useRef(),Om=Ue=>{const un=D.props;un.onMouseMove&&un.onMouseMove(Ue),fa.current={x:Ue.clientX,y:Ue.clientY},da.current&&da.current.update()},Di={},zl=typeof Ie=="string";B?(Di.title=!q&&zl&&!Z?Ie:null,Di["aria-describedby"]=q?be:null):(Di["aria-label"]=zl?Ie:null,Di["aria-labelledby"]=q&&!zl?be:null);const or=z({},Di,it,D.props,{className:De(it.className,D.props.className),onTouchStart:cf,ref:Em},Q?{onMouseMove:Om}:{}),pa={};te||(or.onTouchStart=pf,or.onTouchEnd=Cm),Z||(or.onMouseOver=_d(ff,or.onMouseOver),or.onMouseLeave=_d(df,or.onMouseLeave),Kt||(pa.onMouseOver=ff,pa.onMouseLeave=df)),Y||(or.onFocus=_d(uf,or.onFocus),or.onBlur=_d(Fl,or.onBlur),Kt||(pa.onFocus=uf,pa.onBlur=Fl));const _m=T.exports.useMemo(()=>{var Ue;let un=[{name:"arrow",enabled:Boolean(Wn),options:{element:Wn,padding:4}}];return(Ue=Pe.popperOptions)!=null&&Ue.modifiers&&(un=un.concat(Pe.popperOptions.modifiers)),z({},Pe.popperOptions,{modifiers:un})},[Wn,Pe]),ha=z({},_,{isRtl:kn,arrow:R,disableInteractive:Kt,placement:me,PopperComponentProp:Ae,touch:Qe.current}),Bl=_K(ha),hf=(r=(i=We.popper)!=null?i:W.Popper)!=null?r:PK,mf=(o=(s=(u=We.transition)!=null?u:W.Transition)!=null?s:qt)!=null?o:Jp,jl=(c=(f=We.tooltip)!=null?f:W.Tooltip)!=null?c:TK,gf=(p=(h=We.arrow)!=null?h:W.Arrow)!=null?p:IK,Pm=Lu(hf,z({},Pe,(g=de.popper)!=null?g:L.popper,{className:De(Bl.popper,Pe?.className,(v=(y=de.popper)!=null?y:L.popper)==null?void 0:v.className)}),ha),Tm=Lu(mf,z({},Yt,(b=de.transition)!=null?b:L.transition),ha),Im=Lu(jl,z({},(C=de.tooltip)!=null?C:L.tooltip,{className:De(Bl.tooltip,(x=(w=de.tooltip)!=null?w:L.tooltip)==null?void 0:x.className)}),ha),Rm=Lu(gf,z({},(S=de.arrow)!=null?S:L.arrow,{className:De(Bl.arrow,(E=(I=de.arrow)!=null?I:L.arrow)==null?void 0:E.className)}),ha);return ge(T.exports.Fragment,{children:[T.exports.cloneElement(D,or),N(hf,z({as:Ae??PR,placement:me,anchorEl:Q?{getBoundingClientRect:()=>({top:fa.current.y,left:fa.current.x,right:fa.current.x,bottom:fa.current.y,width:0,height:0})}:pt,popperRef:da,open:pt?q:!1,id:be,transition:!0},pa,Pm,{popperOptions:_m,children:({TransitionProps:Ue})=>N(mf,z({timeout:dt.transitions.duration.shorter},Ue,Tm,{"data-foo":"bar",children:ge(jl,z({},Im,{children:[Ie,R?N(gf,z({},Rm,{ref:Ze})):null]}))}))}))]})}),AK=RK,Ci=(e,t)=>{const n=T.exports.useRef(uT);T.exports.useEffect(()=>{n.current=t},[t]),T.exports.useEffect(()=>{const r=i=>{const{action:o,data:s}=i.data;n.current&&o===e&&n.current(s)};return window.addEventListener("message",r),()=>window.removeEventListener("message",r)},[e])},lb=e=>{Wr("useItem",e.slot)},NR=e=>{const{inventory:{itemAmount:t}}=hr.getState();Wr("giveItem",{slot:e.slot,count:t})};var MK={prefix:"fas",iconName:"circle-info",icon:[512,512,["info-circle"],"f05a","M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"]},$K=MK,DK={prefix:"fas",iconName:"xmark",icon:[320,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z"]},NK=DK;function zC(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function fe(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n-1;i--){var o=n[i],s=(o.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(s)>-1&&(r=o)}return It.head.insertBefore(t,r),e}}var sX="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function Lc(){for(var e=12,t="";e-- >0;)t+=sX[Math.random()*62|0];return t}function Ml(e){for(var t=[],n=(e||[]).length>>>0;n--;)t[n]=e[n];return t}function hb(e){return e.classList?Ml(e.classList):(e.getAttribute("class")||"").split(" ").filter(function(t){return t})}function YR(e){return"".concat(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function lX(e){return Object.keys(e||{}).reduce(function(t,n){return t+"".concat(n,'="').concat(YR(e[n]),'" ')},"").trim()}function hm(e){return Object.keys(e||{}).reduce(function(t,n){return t+"".concat(n,": ").concat(e[n].trim(),";")},"")}function mb(e){return e.size!==Oi.size||e.x!==Oi.x||e.y!==Oi.y||e.rotate!==Oi.rotate||e.flipX||e.flipY}function uX(e){var t=e.transform,n=e.containerWidth,r=e.iconWidth,i={transform:"translate(".concat(n/2," 256)")},o="translate(".concat(t.x*32,", ").concat(t.y*32,") "),s="scale(".concat(t.size/16*(t.flipX?-1:1),", ").concat(t.size/16*(t.flipY?-1:1),") "),u="rotate(".concat(t.rotate," 0 0)"),c={transform:"".concat(o," ").concat(s," ").concat(u)},f={transform:"translate(".concat(r/2*-1," -256)")};return{outer:i,inner:c,path:f}}function cX(e){var t=e.transform,n=e.width,r=n===void 0?Sy:n,i=e.height,o=i===void 0?Sy:i,s=e.startCentered,u=s===void 0?!1:s,c="";return u&&jR?c+="translate(".concat(t.x/ko-r/2,"em, ").concat(t.y/ko-o/2,"em) "):u?c+="translate(calc(-50% + ".concat(t.x/ko,"em), calc(-50% + ").concat(t.y/ko,"em)) "):c+="translate(".concat(t.x/ko,"em, ").concat(t.y/ko,"em) "),c+="scale(".concat(t.size/ko*(t.flipX?-1:1),", ").concat(t.size/ko*(t.flipY?-1:1),") "),c+="rotate(".concat(t.rotate,"deg) "),c}var fX=`:root, :host { - --fa-font-solid: normal 900 1em/1 "Font Awesome 6 Solid"; - --fa-font-regular: normal 400 1em/1 "Font Awesome 6 Regular"; - --fa-font-light: normal 300 1em/1 "Font Awesome 6 Light"; - --fa-font-thin: normal 100 1em/1 "Font Awesome 6 Thin"; - --fa-font-duotone: normal 900 1em/1 "Font Awesome 6 Duotone"; - --fa-font-sharp-solid: normal 900 1em/1 "Font Awesome 6 Sharp"; - --fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"; -} - -svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa { - overflow: visible; - box-sizing: content-box; -} - -.svg-inline--fa { - display: var(--fa-display, inline-block); - height: 1em; - overflow: visible; - vertical-align: -0.125em; -} -.svg-inline--fa.fa-2xs { - vertical-align: 0.1em; -} -.svg-inline--fa.fa-xs { - vertical-align: 0em; -} -.svg-inline--fa.fa-sm { - vertical-align: -0.0714285705em; -} -.svg-inline--fa.fa-lg { - vertical-align: -0.2em; -} -.svg-inline--fa.fa-xl { - vertical-align: -0.25em; -} -.svg-inline--fa.fa-2xl { - vertical-align: -0.3125em; -} -.svg-inline--fa.fa-pull-left { - margin-right: var(--fa-pull-margin, 0.3em); - width: auto; -} -.svg-inline--fa.fa-pull-right { - margin-left: var(--fa-pull-margin, 0.3em); - width: auto; -} -.svg-inline--fa.fa-li { - width: var(--fa-li-width, 2em); - top: 0.25em; -} -.svg-inline--fa.fa-fw { - width: var(--fa-fw-width, 1.25em); -} - -.fa-layers svg.svg-inline--fa { - bottom: 0; - left: 0; - margin: auto; - position: absolute; - right: 0; - top: 0; -} - -.fa-layers-counter, .fa-layers-text { - display: inline-block; - position: absolute; - text-align: center; -} - -.fa-layers { - display: inline-block; - height: 1em; - position: relative; - text-align: center; - vertical-align: -0.125em; - width: 1em; -} -.fa-layers svg.svg-inline--fa { - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.fa-layers-text { - left: 50%; - top: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.fa-layers-counter { - background-color: var(--fa-counter-background-color, #ff253a); - border-radius: var(--fa-counter-border-radius, 1em); - box-sizing: border-box; - color: var(--fa-inverse, #fff); - line-height: var(--fa-counter-line-height, 1); - max-width: var(--fa-counter-max-width, 5em); - min-width: var(--fa-counter-min-width, 1.5em); - overflow: hidden; - padding: var(--fa-counter-padding, 0.25em 0.5em); - right: var(--fa-right, 0); - text-overflow: ellipsis; - top: var(--fa-top, 0); - -webkit-transform: scale(var(--fa-counter-scale, 0.25)); - transform: scale(var(--fa-counter-scale, 0.25)); - -webkit-transform-origin: top right; - transform-origin: top right; -} - -.fa-layers-bottom-right { - bottom: var(--fa-bottom, 0); - right: var(--fa-right, 0); - top: auto; - -webkit-transform: scale(var(--fa-layers-scale, 0.25)); - transform: scale(var(--fa-layers-scale, 0.25)); - -webkit-transform-origin: bottom right; - transform-origin: bottom right; -} - -.fa-layers-bottom-left { - bottom: var(--fa-bottom, 0); - left: var(--fa-left, 0); - right: auto; - top: auto; - -webkit-transform: scale(var(--fa-layers-scale, 0.25)); - transform: scale(var(--fa-layers-scale, 0.25)); - -webkit-transform-origin: bottom left; - transform-origin: bottom left; -} - -.fa-layers-top-right { - top: var(--fa-top, 0); - right: var(--fa-right, 0); - -webkit-transform: scale(var(--fa-layers-scale, 0.25)); - transform: scale(var(--fa-layers-scale, 0.25)); - -webkit-transform-origin: top right; - transform-origin: top right; -} - -.fa-layers-top-left { - left: var(--fa-left, 0); - right: auto; - top: var(--fa-top, 0); - -webkit-transform: scale(var(--fa-layers-scale, 0.25)); - transform: scale(var(--fa-layers-scale, 0.25)); - -webkit-transform-origin: top left; - transform-origin: top left; -} - -.fa-1x { - font-size: 1em; -} - -.fa-2x { - font-size: 2em; -} - -.fa-3x { - font-size: 3em; -} - -.fa-4x { - font-size: 4em; -} - -.fa-5x { - font-size: 5em; -} - -.fa-6x { - font-size: 6em; -} - -.fa-7x { - font-size: 7em; -} - -.fa-8x { - font-size: 8em; -} - -.fa-9x { - font-size: 9em; -} - -.fa-10x { - font-size: 10em; -} - -.fa-2xs { - font-size: 0.625em; - line-height: 0.1em; - vertical-align: 0.225em; -} - -.fa-xs { - font-size: 0.75em; - line-height: 0.0833333337em; - vertical-align: 0.125em; -} - -.fa-sm { - font-size: 0.875em; - line-height: 0.0714285718em; - vertical-align: 0.0535714295em; -} - -.fa-lg { - font-size: 1.25em; - line-height: 0.05em; - vertical-align: -0.075em; -} - -.fa-xl { - font-size: 1.5em; - line-height: 0.0416666682em; - vertical-align: -0.125em; -} - -.fa-2xl { - font-size: 2em; - line-height: 0.03125em; - vertical-align: -0.1875em; -} - -.fa-fw { - text-align: center; - width: 1.25em; -} - -.fa-ul { - list-style-type: none; - margin-left: var(--fa-li-margin, 2.5em); - padding-left: 0; -} -.fa-ul > li { - position: relative; -} - -.fa-li { - left: calc(var(--fa-li-width, 2em) * -1); - position: absolute; - text-align: center; - width: var(--fa-li-width, 2em); - line-height: inherit; -} - -.fa-border { - border-color: var(--fa-border-color, #eee); - border-radius: var(--fa-border-radius, 0.1em); - border-style: var(--fa-border-style, solid); - border-width: var(--fa-border-width, 0.08em); - padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); -} - -.fa-pull-left { - float: left; - margin-right: var(--fa-pull-margin, 0.3em); -} - -.fa-pull-right { - float: right; - margin-left: var(--fa-pull-margin, 0.3em); -} - -.fa-beat { - -webkit-animation-name: fa-beat; - animation-name: fa-beat; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); - animation-timing-function: var(--fa-animation-timing, ease-in-out); -} - -.fa-bounce { - -webkit-animation-name: fa-bounce; - animation-name: fa-bounce; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); -} - -.fa-fade { - -webkit-animation-name: fa-fade; - animation-name: fa-fade; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); -} - -.fa-beat-fade { - -webkit-animation-name: fa-beat-fade; - animation-name: fa-beat-fade; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); -} - -.fa-flip { - -webkit-animation-name: fa-flip; - animation-name: fa-flip; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); - animation-timing-function: var(--fa-animation-timing, ease-in-out); -} - -.fa-shake { - -webkit-animation-name: fa-shake; - animation-name: fa-shake; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, linear); - animation-timing-function: var(--fa-animation-timing, linear); -} - -.fa-spin { - -webkit-animation-name: fa-spin; - animation-name: fa-spin; - -webkit-animation-delay: var(--fa-animation-delay, 0s); - animation-delay: var(--fa-animation-delay, 0s); - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 2s); - animation-duration: var(--fa-animation-duration, 2s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, linear); - animation-timing-function: var(--fa-animation-timing, linear); -} - -.fa-spin-reverse { - --fa-animation-direction: reverse; -} - -.fa-pulse, -.fa-spin-pulse { - -webkit-animation-name: fa-spin; - animation-name: fa-spin; - -webkit-animation-direction: var(--fa-animation-direction, normal); - animation-direction: var(--fa-animation-direction, normal); - -webkit-animation-duration: var(--fa-animation-duration, 1s); - animation-duration: var(--fa-animation-duration, 1s); - -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); - animation-timing-function: var(--fa-animation-timing, steps(8)); -} - -@media (prefers-reduced-motion: reduce) { - .fa-beat, -.fa-bounce, -.fa-fade, -.fa-beat-fade, -.fa-flip, -.fa-pulse, -.fa-shake, -.fa-spin, -.fa-spin-pulse { - -webkit-animation-delay: -1ms; - animation-delay: -1ms; - -webkit-animation-duration: 1ms; - animation-duration: 1ms; - -webkit-animation-iteration-count: 1; - animation-iteration-count: 1; - transition-delay: 0s; - transition-duration: 0s; - } -} -@-webkit-keyframes fa-beat { - 0%, 90% { - -webkit-transform: scale(1); - transform: scale(1); - } - 45% { - -webkit-transform: scale(var(--fa-beat-scale, 1.25)); - transform: scale(var(--fa-beat-scale, 1.25)); - } -} -@keyframes fa-beat { - 0%, 90% { - -webkit-transform: scale(1); - transform: scale(1); - } - 45% { - -webkit-transform: scale(var(--fa-beat-scale, 1.25)); - transform: scale(var(--fa-beat-scale, 1.25)); - } -} -@-webkit-keyframes fa-bounce { - 0% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - 10% { - -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); - } - 30% { - -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); - } - 50% { - -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); - } - 57% { - -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - } - 64% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - 100% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } -} -@keyframes fa-bounce { - 0% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - 10% { - -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); - } - 30% { - -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); - } - 50% { - -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); - } - 57% { - -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); - } - 64% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } - 100% { - -webkit-transform: scale(1, 1) translateY(0); - transform: scale(1, 1) translateY(0); - } -} -@-webkit-keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); - } -} -@keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); - } -} -@-webkit-keyframes fa-beat-fade { - 0%, 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - opacity: 1; - -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); - transform: scale(var(--fa-beat-fade-scale, 1.125)); - } -} -@keyframes fa-beat-fade { - 0%, 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - opacity: 1; - -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); - transform: scale(var(--fa-beat-fade-scale, 1.125)); - } -} -@-webkit-keyframes fa-flip { - 50% { - -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); - transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); - } -} -@keyframes fa-flip { - 50% { - -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); - transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); - } -} -@-webkit-keyframes fa-shake { - 0% { - -webkit-transform: rotate(-15deg); - transform: rotate(-15deg); - } - 4% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 8%, 24% { - -webkit-transform: rotate(-18deg); - transform: rotate(-18deg); - } - 12%, 28% { - -webkit-transform: rotate(18deg); - transform: rotate(18deg); - } - 16% { - -webkit-transform: rotate(-22deg); - transform: rotate(-22deg); - } - 20% { - -webkit-transform: rotate(22deg); - transform: rotate(22deg); - } - 32% { - -webkit-transform: rotate(-12deg); - transform: rotate(-12deg); - } - 36% { - -webkit-transform: rotate(12deg); - transform: rotate(12deg); - } - 40%, 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes fa-shake { - 0% { - -webkit-transform: rotate(-15deg); - transform: rotate(-15deg); - } - 4% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 8%, 24% { - -webkit-transform: rotate(-18deg); - transform: rotate(-18deg); - } - 12%, 28% { - -webkit-transform: rotate(18deg); - transform: rotate(18deg); - } - 16% { - -webkit-transform: rotate(-22deg); - transform: rotate(-22deg); - } - 20% { - -webkit-transform: rotate(22deg); - transform: rotate(22deg); - } - 32% { - -webkit-transform: rotate(-12deg); - transform: rotate(-12deg); - } - 36% { - -webkit-transform: rotate(12deg); - transform: rotate(12deg); - } - 40%, 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -.fa-rotate-90 { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} - -.fa-rotate-180 { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} - -.fa-rotate-270 { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); -} - -.fa-flip-horizontal { - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); -} - -.fa-flip-vertical { - -webkit-transform: scale(1, -1); - transform: scale(1, -1); -} - -.fa-flip-both, -.fa-flip-horizontal.fa-flip-vertical { - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); -} - -.fa-rotate-by { - -webkit-transform: rotate(var(--fa-rotate-angle, none)); - transform: rotate(var(--fa-rotate-angle, none)); -} - -.fa-stack { - display: inline-block; - vertical-align: middle; - height: 2em; - position: relative; - width: 2.5em; -} - -.fa-stack-1x, -.fa-stack-2x { - bottom: 0; - left: 0; - margin: auto; - position: absolute; - right: 0; - top: 0; - z-index: var(--fa-stack-z-index, auto); -} - -.svg-inline--fa.fa-stack-1x { - height: 1em; - width: 1.25em; -} -.svg-inline--fa.fa-stack-2x { - height: 2em; - width: 2.5em; -} - -.fa-inverse { - color: var(--fa-inverse, #fff); -} - -.sr-only, -.fa-sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.sr-only-focusable:not(:focus), -.fa-sr-only-focusable:not(:focus) { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.svg-inline--fa .fa-primary { - fill: var(--fa-primary-color, currentColor); - opacity: var(--fa-primary-opacity, 1); -} - -.svg-inline--fa .fa-secondary { - fill: var(--fa-secondary-color, currentColor); - opacity: var(--fa-secondary-opacity, 0.4); -} - -.svg-inline--fa.fa-swap-opacity .fa-primary { - opacity: var(--fa-secondary-opacity, 0.4); -} - -.svg-inline--fa.fa-swap-opacity .fa-secondary { - opacity: var(--fa-primary-opacity, 1); -} - -.svg-inline--fa mask .fa-primary, -.svg-inline--fa mask .fa-secondary { - fill: black; -} - -.fad.fa-inverse, -.fa-duotone.fa-inverse { - color: var(--fa-inverse, #fff); -}`;function KR(){var e=WR,t=UR,n=ye.cssPrefix,r=ye.replacementClass,i=fX;if(n!==e||r!==t){var o=new RegExp("\\.".concat(e,"\\-"),"g"),s=new RegExp("\\--".concat(e,"\\-"),"g"),u=new RegExp("\\.".concat(t),"g");i=i.replace(o,".".concat(n,"-")).replace(s,"--".concat(n,"-")).replace(u,".".concat(r))}return i}var GC=!1;function Nv(){ye.autoAddCss&&!GC&&(aX(KR()),GC=!0)}var dX={mixout:function(){return{dom:{css:KR,insertCss:Nv}}},hooks:function(){return{beforeDOMElementCreation:function(){Nv()},beforeI2svg:function(){Nv()}}}},oo=ea||{};oo[io]||(oo[io]={});oo[io].styles||(oo[io].styles={});oo[io].hooks||(oo[io].hooks={});oo[io].shims||(oo[io].shims=[]);var ci=oo[io],XR=[],pX=function e(){It.removeEventListener("DOMContentLoaded",e),th=1,XR.map(function(t){return t()})},th=!1;fo&&(th=(It.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(It.readyState),th||It.addEventListener("DOMContentLoaded",pX));function hX(e){!fo||(th?setTimeout(e,0):XR.push(e))}function tf(e){var t=e.tag,n=e.attributes,r=n===void 0?{}:n,i=e.children,o=i===void 0?[]:i;return typeof e=="string"?YR(e):"<".concat(t," ").concat(lX(r),">").concat(o.map(tf).join(""),"")}function qC(e,t,n){if(e&&e[t]&&e[t][n])return{prefix:t,iconName:n,icon:e[t][n]}}var mX=function(t,n){return function(r,i,o,s){return t.call(n,r,i,o,s)}},Lv=function(t,n,r,i){var o=Object.keys(t),s=o.length,u=i!==void 0?mX(n,i):n,c,f,p;for(r===void 0?(c=1,p=t[o[0]]):(c=0,p=r);c=55296&&i<=56319&&n=55296&&r<=56319&&n>t+1&&(i=e.charCodeAt(t+1),i>=56320&&i<=57343)?(r-55296)*1024+i-56320+65536:r}function YC(e){return Object.keys(e).reduce(function(t,n){var r=e[n],i=!!r.icon;return i?t[r.iconName]=r.icon:t[n]=r,t},{})}function Ey(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.skipHooks,i=r===void 0?!1:r,o=YC(t);typeof ci.hooks.addPack=="function"&&!i?ci.hooks.addPack(e,YC(t)):ci.styles[e]=fe(fe({},ci.styles[e]||{}),o),e==="fas"&&Ey("fa",t)}var $d,Dd,Nd,Ws=ci.styles,yX=ci.shims,xX=($d={},sn($d,_t,Object.values(Dc[_t])),sn($d,Ut,Object.values(Dc[Ut])),$d),gb=null,QR={},ZR={},JR={},eA={},tA={},bX=(Dd={},sn(Dd,_t,Object.keys(Mc[_t])),sn(Dd,Ut,Object.keys(Mc[Ut])),Dd);function wX(e){return~tX.indexOf(e)}function SX(e,t){var n=t.split("-"),r=n[0],i=n.slice(1).join("-");return r===e&&i!==""&&!wX(i)?i:null}var nA=function(){var t=function(o){return Lv(Ws,function(s,u,c){return s[c]=Lv(u,o,{}),s},{})};QR=t(function(i,o,s){if(o[3]&&(i[o[3]]=s),o[2]){var u=o[2].filter(function(c){return typeof c=="number"});u.forEach(function(c){i[c.toString(16)]=s})}return i}),ZR=t(function(i,o,s){if(i[s]=s,o[2]){var u=o[2].filter(function(c){return typeof c=="string"});u.forEach(function(c){i[c]=s})}return i}),tA=t(function(i,o,s){var u=o[2];return i[s]=s,u.forEach(function(c){i[c]=s}),i});var n="far"in Ws||ye.autoFetchSvg,r=Lv(yX,function(i,o){var s=o[0],u=o[1],c=o[2];return u==="far"&&!n&&(u="fas"),typeof s=="string"&&(i.names[s]={prefix:u,iconName:c}),typeof s=="number"&&(i.unicodes[s.toString(16)]={prefix:u,iconName:c}),i},{names:{},unicodes:{}});JR=r.names,eA=r.unicodes,gb=mm(ye.styleDefault,{family:ye.familyDefault})};oX(function(e){gb=mm(e.styleDefault,{family:ye.familyDefault})});nA();function vb(e,t){return(QR[e]||{})[t]}function kX(e,t){return(ZR[e]||{})[t]}function Da(e,t){return(tA[e]||{})[t]}function rA(e){return JR[e]||{prefix:null,iconName:null}}function CX(e){var t=eA[e],n=vb("fas",e);return t||(n?{prefix:"fas",iconName:n}:null)||{prefix:null,iconName:null}}function ta(){return gb}var yb=function(){return{prefix:null,iconName:null,rest:[]}};function mm(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=t.family,r=n===void 0?_t:n,i=Mc[r][e],o=$c[r][e]||$c[r][i],s=e in ci.styles?e:null;return o||s||null}var KC=(Nd={},sn(Nd,_t,Object.keys(Dc[_t])),sn(Nd,Ut,Object.keys(Dc[Ut])),Nd);function gm(e){var t,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.skipLookups,i=r===void 0?!1:r,o=(t={},sn(t,_t,"".concat(ye.cssPrefix,"-").concat(_t)),sn(t,Ut,"".concat(ye.cssPrefix,"-").concat(Ut)),t),s=null,u=_t;(e.includes(o[_t])||e.some(function(f){return KC[_t].includes(f)}))&&(u=_t),(e.includes(o[Ut])||e.some(function(f){return KC[Ut].includes(f)}))&&(u=Ut);var c=e.reduce(function(f,p){var h=SX(ye.cssPrefix,p);if(Ws[p]?(p=xX[u].includes(p)?KK[u][p]:p,s=p,f.prefix=p):bX[u].indexOf(p)>-1?(s=p,f.prefix=mm(p,{family:u})):h?f.iconName=h:p!==ye.replacementClass&&p!==o[_t]&&p!==o[Ut]&&f.rest.push(p),!i&&f.prefix&&f.iconName){var g=s==="fa"?rA(f.iconName):{},v=Da(f.prefix,f.iconName);g.prefix&&(s=null),f.iconName=g.iconName||v||f.iconName,f.prefix=g.prefix||f.prefix,f.prefix==="far"&&!Ws.far&&Ws.fas&&!ye.autoFetchSvg&&(f.prefix="fas")}return f},yb());return(e.includes("fa-brands")||e.includes("fab"))&&(c.prefix="fab"),(e.includes("fa-duotone")||e.includes("fad"))&&(c.prefix="fad"),!c.prefix&&u===Ut&&(Ws.fass||ye.autoFetchSvg)&&(c.prefix="fass",c.iconName=Da(c.prefix,c.iconName)||c.iconName),(c.prefix==="fa"||s==="fa")&&(c.prefix=ta()||"fas"),c}var EX=function(){function e(){LK(this,e),this.definitions={}}return FK(e,[{key:"add",value:function(){for(var n=this,r=arguments.length,i=new Array(r),o=0;o0&&p.forEach(function(h){typeof h=="string"&&(n[u][h]=f)}),n[u][c]=f}),n}}]),e}(),XC=[],Us={},nl={},OX=Object.keys(nl);function _X(e,t){var n=t.mixoutsTo;return XC=e,Us={},Object.keys(nl).forEach(function(r){OX.indexOf(r)===-1&&delete nl[r]}),XC.forEach(function(r){var i=r.mixout?r.mixout():{};if(Object.keys(i).forEach(function(s){typeof i[s]=="function"&&(n[s]=i[s]),eh(i[s])==="object"&&Object.keys(i[s]).forEach(function(u){n[s]||(n[s]={}),n[s][u]=i[s][u]})}),r.hooks){var o=r.hooks();Object.keys(o).forEach(function(s){Us[s]||(Us[s]=[]),Us[s].push(o[s])})}r.provides&&r.provides(nl)}),n}function Oy(e,t){for(var n=arguments.length,r=new Array(n>2?n-2:0),i=2;i1?t-1:0),r=1;r0&&arguments[0]!==void 0?arguments[0]:{};return fo?(Ka("beforeI2svg",t),ao("pseudoElements2svg",t),ao("i2svg",t)):Promise.reject("Operation requires a DOM of some kind.")},watch:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=t.autoReplaceSvgRoot;ye.autoReplaceSvg===!1&&(ye.autoReplaceSvg=!0),ye.observeMutations=!0,hX(function(){RX({autoReplaceSvgRoot:n}),Ka("watch",t)})}},IX={icon:function(t){if(t===null)return null;if(eh(t)==="object"&&t.prefix&&t.iconName)return{prefix:t.prefix,iconName:Da(t.prefix,t.iconName)||t.iconName};if(Array.isArray(t)&&t.length===2){var n=t[1].indexOf("fa-")===0?t[1].slice(3):t[1],r=mm(t[0]);return{prefix:r,iconName:Da(r,n)||n}}if(typeof t=="string"&&(t.indexOf("".concat(ye.cssPrefix,"-"))>-1||t.match(XK))){var i=gm(t.split(" "),{skipLookups:!0});return{prefix:i.prefix||ta(),iconName:Da(i.prefix,i.iconName)||i.iconName}}if(typeof t=="string"){var o=ta();return{prefix:o,iconName:Da(o,t)||t}}}},Er={noAuto:PX,config:ye,dom:TX,parse:IX,library:iA,findIconDefinition:_y,toHtml:tf},RX=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=t.autoReplaceSvgRoot,r=n===void 0?It:n;(Object.keys(ci.styles).length>0||ye.autoFetchSvg)&&fo&&ye.autoReplaceSvg&&Er.dom.i2svg({node:r})};function vm(e,t){return Object.defineProperty(e,"abstract",{get:t}),Object.defineProperty(e,"html",{get:function(){return e.abstract.map(function(r){return tf(r)})}}),Object.defineProperty(e,"node",{get:function(){if(!!fo){var r=It.createElement("div");return r.innerHTML=e.html,r.children}}}),e}function AX(e){var t=e.children,n=e.main,r=e.mask,i=e.attributes,o=e.styles,s=e.transform;if(mb(s)&&n.found&&!r.found){var u=n.width,c=n.height,f={x:u/c/2,y:.5};i.style=hm(fe(fe({},o),{},{"transform-origin":"".concat(f.x+s.x/16,"em ").concat(f.y+s.y/16,"em")}))}return[{tag:"svg",attributes:i,children:t}]}function MX(e){var t=e.prefix,n=e.iconName,r=e.children,i=e.attributes,o=e.symbol,s=o===!0?"".concat(t,"-").concat(ye.cssPrefix,"-").concat(n):o;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:fe(fe({},i),{},{id:s}),children:r}]}]}function xb(e){var t=e.icons,n=t.main,r=t.mask,i=e.prefix,o=e.iconName,s=e.transform,u=e.symbol,c=e.title,f=e.maskId,p=e.titleId,h=e.extra,g=e.watchable,v=g===void 0?!1:g,y=r.found?r:n,b=y.width,C=y.height,x=i==="fak",w=[ye.replacementClass,o?"".concat(ye.cssPrefix,"-").concat(o):""].filter(function(W){return h.classes.indexOf(W)===-1}).filter(function(W){return W!==""||!!W}).concat(h.classes).join(" "),S={children:[],attributes:fe(fe({},h.attributes),{},{"data-prefix":i,"data-icon":o,class:w,role:h.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(b," ").concat(C)})},E=x&&!~h.classes.indexOf("fa-fw")?{width:"".concat(b/C*16*.0625,"em")}:{};v&&(S.attributes[Ya]=""),c&&(S.children.push({tag:"title",attributes:{id:S.attributes["aria-labelledby"]||"title-".concat(p||Lc())},children:[c]}),delete S.attributes.title);var I=fe(fe({},S),{},{prefix:i,iconName:o,main:n,mask:r,maskId:f,transform:s,symbol:u,styles:fe(fe({},E),h.styles)}),_=r.found&&n.found?ao("generateAbstractMask",I)||{children:[],attributes:{}}:ao("generateAbstractIcon",I)||{children:[],attributes:{}},R=_.children,D=_.attributes;return I.children=R,I.attributes=D,u?MX(I):AX(I)}function QC(e){var t=e.content,n=e.width,r=e.height,i=e.transform,o=e.title,s=e.extra,u=e.watchable,c=u===void 0?!1:u,f=fe(fe(fe({},s.attributes),o?{title:o}:{}),{},{class:s.classes.join(" ")});c&&(f[Ya]="");var p=fe({},s.styles);mb(i)&&(p.transform=cX({transform:i,startCentered:!0,width:n,height:r}),p["-webkit-transform"]=p.transform);var h=hm(p);h.length>0&&(f.style=h);var g=[];return g.push({tag:"span",attributes:f,children:[t]}),o&&g.push({tag:"span",attributes:{class:"sr-only"},children:[o]}),g}function $X(e){var t=e.content,n=e.title,r=e.extra,i=fe(fe(fe({},r.attributes),n?{title:n}:{}),{},{class:r.classes.join(" ")}),o=hm(r.styles);o.length>0&&(i.style=o);var s=[];return s.push({tag:"span",attributes:i,children:[t]}),n&&s.push({tag:"span",attributes:{class:"sr-only"},children:[n]}),s}var Fv=ci.styles;function Py(e){var t=e[0],n=e[1],r=e.slice(4),i=ub(r,1),o=i[0],s=null;return Array.isArray(o)?s={tag:"g",attributes:{class:"".concat(ye.cssPrefix,"-").concat($a.GROUP)},children:[{tag:"path",attributes:{class:"".concat(ye.cssPrefix,"-").concat($a.SECONDARY),fill:"currentColor",d:o[0]}},{tag:"path",attributes:{class:"".concat(ye.cssPrefix,"-").concat($a.PRIMARY),fill:"currentColor",d:o[1]}}]}:s={tag:"path",attributes:{fill:"currentColor",d:o}},{found:!0,width:t,height:n,icon:s}}var DX={found:!1,width:512,height:512};function NX(e,t){!HR&&!ye.showMissingIcons&&e&&console.error('Icon with name "'.concat(e,'" and prefix "').concat(t,'" is missing.'))}function Ty(e,t){var n=t;return t==="fa"&&ye.styleDefault!==null&&(t=ta()),new Promise(function(r,i){if(ao("missingIconAbstract"),n==="fa"){var o=rA(e)||{};e=o.iconName||e,t=o.prefix||t}if(e&&t&&Fv[t]&&Fv[t][e]){var s=Fv[t][e];return r(Py(s))}NX(e,t),r(fe(fe({},DX),{},{icon:ye.showMissingIcons&&e?ao("missingIconAbstract")||{}:{}}))})}var ZC=function(){},Iy=ye.measurePerformance&&Pd&&Pd.mark&&Pd.measure?Pd:{mark:ZC,measure:ZC},zu='FA "6.2.1"',LX=function(t){return Iy.mark("".concat(zu," ").concat(t," begins")),function(){return oA(t)}},oA=function(t){Iy.mark("".concat(zu," ").concat(t," ends")),Iy.measure("".concat(zu," ").concat(t),"".concat(zu," ").concat(t," begins"),"".concat(zu," ").concat(t," ends"))},bb={begin:LX,end:oA},lp=function(){};function JC(e){var t=e.getAttribute?e.getAttribute(Ya):null;return typeof t=="string"}function FX(e){var t=e.getAttribute?e.getAttribute(fb):null,n=e.getAttribute?e.getAttribute(db):null;return t&&n}function zX(e){return e&&e.classList&&e.classList.contains&&e.classList.contains(ye.replacementClass)}function BX(){if(ye.autoReplaceSvg===!0)return up.replace;var e=up[ye.autoReplaceSvg];return e||up.replace}function jX(e){return It.createElementNS("http://www.w3.org/2000/svg",e)}function WX(e){return It.createElement(e)}function aA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=t.ceFn,r=n===void 0?e.tag==="svg"?jX:WX:n;if(typeof e=="string")return It.createTextNode(e);var i=r(e.tag);Object.keys(e.attributes||[]).forEach(function(s){i.setAttribute(s,e.attributes[s])});var o=e.children||[];return o.forEach(function(s){i.appendChild(aA(s,{ceFn:r}))}),i}function UX(e){var t=" ".concat(e.outerHTML," ");return t="".concat(t,"Font Awesome fontawesome.com "),t}var up={replace:function(t){var n=t[0];if(n.parentNode)if(t[1].forEach(function(i){n.parentNode.insertBefore(aA(i),n)}),n.getAttribute(Ya)===null&&ye.keepOriginalSource){var r=It.createComment(UX(n));n.parentNode.replaceChild(r,n)}else n.remove()},nest:function(t){var n=t[0],r=t[1];if(~hb(n).indexOf(ye.replacementClass))return up.replace(t);var i=new RegExp("".concat(ye.cssPrefix,"-.*"));if(delete r[0].attributes.id,r[0].attributes.class){var o=r[0].attributes.class.split(" ").reduce(function(u,c){return c===ye.replacementClass||c.match(i)?u.toSvg.push(c):u.toNode.push(c),u},{toNode:[],toSvg:[]});r[0].attributes.class=o.toSvg.join(" "),o.toNode.length===0?n.removeAttribute("class"):n.setAttribute("class",o.toNode.join(" "))}var s=r.map(function(u){return tf(u)}).join(` -`);n.setAttribute(Ya,""),n.innerHTML=s}};function eE(e){e()}function sA(e,t){var n=typeof t=="function"?t:lp;if(e.length===0)n();else{var r=eE;ye.mutateApproach===qK&&(r=ea.requestAnimationFrame||eE),r(function(){var i=BX(),o=bb.begin("mutate");e.map(i),o(),n()})}}var wb=!1;function lA(){wb=!0}function Ry(){wb=!1}var nh=null;function tE(e){if(!!HC&&!!ye.observeMutations){var t=e.treeCallback,n=t===void 0?lp:t,r=e.nodeCallback,i=r===void 0?lp:r,o=e.pseudoElementsCallback,s=o===void 0?lp:o,u=e.observeMutationsRoot,c=u===void 0?It:u;nh=new HC(function(f){if(!wb){var p=ta();Ml(f).forEach(function(h){if(h.type==="childList"&&h.addedNodes.length>0&&!JC(h.addedNodes[0])&&(ye.searchPseudoElements&&s(h.target),n(h.target)),h.type==="attributes"&&h.target.parentNode&&ye.searchPseudoElements&&s(h.target.parentNode),h.type==="attributes"&&JC(h.target)&&~eX.indexOf(h.attributeName))if(h.attributeName==="class"&&FX(h.target)){var g=gm(hb(h.target)),v=g.prefix,y=g.iconName;h.target.setAttribute(fb,v||p),y&&h.target.setAttribute(db,y)}else zX(h.target)&&i(h.target)})}}),fo&&nh.observe(c,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function HX(){!nh||nh.disconnect()}function VX(e){var t=e.getAttribute("style"),n=[];return t&&(n=t.split(";").reduce(function(r,i){var o=i.split(":"),s=o[0],u=o.slice(1);return s&&u.length>0&&(r[s]=u.join(":").trim()),r},{})),n}function GX(e){var t=e.getAttribute("data-prefix"),n=e.getAttribute("data-icon"),r=e.innerText!==void 0?e.innerText.trim():"",i=gm(hb(e));return i.prefix||(i.prefix=ta()),t&&n&&(i.prefix=t,i.iconName=n),i.iconName&&i.prefix||(i.prefix&&r.length>0&&(i.iconName=kX(i.prefix,e.innerText)||vb(i.prefix,Cy(e.innerText))),!i.iconName&&ye.autoFetchSvg&&e.firstChild&&e.firstChild.nodeType===Node.TEXT_NODE&&(i.iconName=e.firstChild.data)),i}function qX(e){var t=Ml(e.attributes).reduce(function(i,o){return i.name!=="class"&&i.name!=="style"&&(i[o.name]=o.value),i},{}),n=e.getAttribute("title"),r=e.getAttribute("data-fa-title-id");return ye.autoA11y&&(n?t["aria-labelledby"]="".concat(ye.replacementClass,"-title-").concat(r||Lc()):(t["aria-hidden"]="true",t.focusable="false")),t}function YX(){return{iconName:null,title:null,titleId:null,prefix:null,transform:Oi,symbol:!1,mask:{iconName:null,prefix:null,rest:[]},maskId:null,extra:{classes:[],styles:{},attributes:{}}}}function nE(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{styleParser:!0},n=GX(e),r=n.iconName,i=n.prefix,o=n.rest,s=qX(e),u=Oy("parseNodeAttributes",{},e),c=t.styleParser?VX(e):[];return fe({iconName:r,title:e.getAttribute("title"),titleId:e.getAttribute("data-fa-title-id"),prefix:i,transform:Oi,mask:{iconName:null,prefix:null,rest:[]},maskId:null,symbol:!1,extra:{classes:o,styles:c,attributes:s}},u)}var KX=ci.styles;function uA(e){var t=ye.autoReplaceSvg==="nest"?nE(e,{styleParser:!1}):nE(e);return~t.extra.classes.indexOf(VR)?ao("generateLayersText",e,t):ao("generateSvgReplacementMutation",e,t)}var na=new Set;pb.map(function(e){na.add("fa-".concat(e))});Object.keys(Mc[_t]).map(na.add.bind(na));Object.keys(Mc[Ut]).map(na.add.bind(na));na=Jc(na);function rE(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;if(!fo)return Promise.resolve();var n=It.documentElement.classList,r=function(h){return n.add("".concat(VC,"-").concat(h))},i=function(h){return n.remove("".concat(VC,"-").concat(h))},o=ye.autoFetchSvg?na:pb.map(function(p){return"fa-".concat(p)}).concat(Object.keys(KX));o.includes("fa")||o.push("fa");var s=[".".concat(VR,":not([").concat(Ya,"])")].concat(o.map(function(p){return".".concat(p,":not([").concat(Ya,"])")})).join(", ");if(s.length===0)return Promise.resolve();var u=[];try{u=Ml(e.querySelectorAll(s))}catch{}if(u.length>0)r("pending"),i("complete");else return Promise.resolve();var c=bb.begin("onTree"),f=u.reduce(function(p,h){try{var g=uA(h);g&&p.push(g)}catch(v){HR||v.name==="MissingIcon"&&console.error(v)}return p},[]);return new Promise(function(p,h){Promise.all(f).then(function(g){sA(g,function(){r("active"),r("complete"),i("pending"),typeof t=="function"&&t(),c(),p()})}).catch(function(g){c(),h(g)})})}function XX(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;uA(e).then(function(n){n&&sA([n],t)})}function QX(e){return function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=(t||{}).icon?t:_y(t||{}),i=n.mask;return i&&(i=(i||{}).icon?i:_y(i||{})),e(r,fe(fe({},n),{},{mask:i}))}}var ZX=function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.transform,i=r===void 0?Oi:r,o=n.symbol,s=o===void 0?!1:o,u=n.mask,c=u===void 0?null:u,f=n.maskId,p=f===void 0?null:f,h=n.title,g=h===void 0?null:h,v=n.titleId,y=v===void 0?null:v,b=n.classes,C=b===void 0?[]:b,x=n.attributes,w=x===void 0?{}:x,S=n.styles,E=S===void 0?{}:S;if(!!t){var I=t.prefix,_=t.iconName,R=t.icon;return vm(fe({type:"icon"},t),function(){return Ka("beforeDOMElementCreation",{iconDefinition:t,params:n}),ye.autoA11y&&(g?w["aria-labelledby"]="".concat(ye.replacementClass,"-title-").concat(y||Lc()):(w["aria-hidden"]="true",w.focusable="false")),xb({icons:{main:Py(R),mask:c?Py(c.icon):{found:!1,width:null,height:null,icon:{}}},prefix:I,iconName:_,transform:fe(fe({},Oi),i),symbol:s,title:g,maskId:p,titleId:y,extra:{attributes:w,styles:E,classes:C}})})}},JX={mixout:function(){return{icon:QX(ZX)}},hooks:function(){return{mutationObserverCallbacks:function(n){return n.treeCallback=rE,n.nodeCallback=XX,n}}},provides:function(t){t.i2svg=function(n){var r=n.node,i=r===void 0?It:r,o=n.callback,s=o===void 0?function(){}:o;return rE(i,s)},t.generateSvgReplacementMutation=function(n,r){var i=r.iconName,o=r.title,s=r.titleId,u=r.prefix,c=r.transform,f=r.symbol,p=r.mask,h=r.maskId,g=r.extra;return new Promise(function(v,y){Promise.all([Ty(i,u),p.iconName?Ty(p.iconName,p.prefix):Promise.resolve({found:!1,width:512,height:512,icon:{}})]).then(function(b){var C=ub(b,2),x=C[0],w=C[1];v([n,xb({icons:{main:x,mask:w},prefix:u,iconName:i,transform:c,symbol:f,maskId:h,title:o,titleId:s,extra:g,watchable:!0})])}).catch(y)})},t.generateAbstractIcon=function(n){var r=n.children,i=n.attributes,o=n.main,s=n.transform,u=n.styles,c=hm(u);c.length>0&&(i.style=c);var f;return mb(s)&&(f=ao("generateAbstractTransformGrouping",{main:o,transform:s,containerWidth:o.width,iconWidth:o.width})),r.push(f||o.icon),{children:r,attributes:i}}}},eQ={mixout:function(){return{layer:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=r.classes,o=i===void 0?[]:i;return vm({type:"layer"},function(){Ka("beforeDOMElementCreation",{assembler:n,params:r});var s=[];return n(function(u){Array.isArray(u)?u.map(function(c){s=s.concat(c.abstract)}):s=s.concat(u.abstract)}),[{tag:"span",attributes:{class:["".concat(ye.cssPrefix,"-layers")].concat(Jc(o)).join(" ")},children:s}]})}}}},tQ={mixout:function(){return{counter:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=r.title,o=i===void 0?null:i,s=r.classes,u=s===void 0?[]:s,c=r.attributes,f=c===void 0?{}:c,p=r.styles,h=p===void 0?{}:p;return vm({type:"counter",content:n},function(){return Ka("beforeDOMElementCreation",{content:n,params:r}),$X({content:n.toString(),title:o,extra:{attributes:f,styles:h,classes:["".concat(ye.cssPrefix,"-layers-counter")].concat(Jc(u))}})})}}}},nQ={mixout:function(){return{text:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=r.transform,o=i===void 0?Oi:i,s=r.title,u=s===void 0?null:s,c=r.classes,f=c===void 0?[]:c,p=r.attributes,h=p===void 0?{}:p,g=r.styles,v=g===void 0?{}:g;return vm({type:"text",content:n},function(){return Ka("beforeDOMElementCreation",{content:n,params:r}),QC({content:n,transform:fe(fe({},Oi),o),title:u,extra:{attributes:h,styles:v,classes:["".concat(ye.cssPrefix,"-layers-text")].concat(Jc(f))}})})}}},provides:function(t){t.generateLayersText=function(n,r){var i=r.title,o=r.transform,s=r.extra,u=null,c=null;if(jR){var f=parseInt(getComputedStyle(n).fontSize,10),p=n.getBoundingClientRect();u=p.width/f,c=p.height/f}return ye.autoA11y&&!i&&(s.attributes["aria-hidden"]="true"),Promise.resolve([n,QC({content:n.innerHTML,width:u,height:c,transform:o,title:i,extra:s,watchable:!0})])}}},rQ=new RegExp('"',"ug"),iE=[1105920,1112319];function iQ(e){var t=e.replace(rQ,""),n=vX(t,0),r=n>=iE[0]&&n<=iE[1],i=t.length===2?t[0]===t[1]:!1;return{value:Cy(i?t[0]:t),isSecondary:r||i}}function oE(e,t){var n="".concat(GK).concat(t.replace(":","-"));return new Promise(function(r,i){if(e.getAttribute(n)!==null)return r();var o=Ml(e.children),s=o.filter(function(R){return R.getAttribute(ky)===t})[0],u=ea.getComputedStyle(e,t),c=u.getPropertyValue("font-family").match(QK),f=u.getPropertyValue("font-weight"),p=u.getPropertyValue("content");if(s&&!c)return e.removeChild(s),r();if(c&&p!=="none"&&p!==""){var h=u.getPropertyValue("content"),g=~["Sharp"].indexOf(c[2])?Ut:_t,v=~["Solid","Regular","Light","Thin","Duotone","Brands","Kit"].indexOf(c[2])?$c[g][c[2].toLowerCase()]:ZK[g][f],y=iQ(h),b=y.value,C=y.isSecondary,x=c[0].startsWith("FontAwesome"),w=vb(v,b),S=w;if(x){var E=CX(b);E.iconName&&E.prefix&&(w=E.iconName,v=E.prefix)}if(w&&!C&&(!s||s.getAttribute(fb)!==v||s.getAttribute(db)!==S)){e.setAttribute(n,S),s&&e.removeChild(s);var I=YX(),_=I.extra;_.attributes[ky]=t,Ty(w,v).then(function(R){var D=xb(fe(fe({},I),{},{icons:{main:R,mask:yb()},prefix:v,iconName:S,extra:_,watchable:!0})),W=It.createElement("svg");t==="::before"?e.insertBefore(W,e.firstChild):e.appendChild(W),W.outerHTML=D.map(function(L){return tf(L)}).join(` -`),e.removeAttribute(n),r()}).catch(i)}else r()}else r()})}function oQ(e){return Promise.all([oE(e,"::before"),oE(e,"::after")])}function aQ(e){return e.parentNode!==document.head&&!~YK.indexOf(e.tagName.toUpperCase())&&!e.getAttribute(ky)&&(!e.parentNode||e.parentNode.tagName!=="svg")}function aE(e){if(!!fo)return new Promise(function(t,n){var r=Ml(e.querySelectorAll("*")).filter(aQ).map(oQ),i=bb.begin("searchPseudoElements");lA(),Promise.all(r).then(function(){i(),Ry(),t()}).catch(function(){i(),Ry(),n()})})}var sQ={hooks:function(){return{mutationObserverCallbacks:function(n){return n.pseudoElementsCallback=aE,n}}},provides:function(t){t.pseudoElements2svg=function(n){var r=n.node,i=r===void 0?It:r;ye.searchPseudoElements&&aE(i)}}},sE=!1,lQ={mixout:function(){return{dom:{unwatch:function(){lA(),sE=!0}}}},hooks:function(){return{bootstrap:function(){tE(Oy("mutationObserverCallbacks",{}))},noAuto:function(){HX()},watch:function(n){var r=n.observeMutationsRoot;sE?Ry():tE(Oy("mutationObserverCallbacks",{observeMutationsRoot:r}))}}}},lE=function(t){var n={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return t.toLowerCase().split(" ").reduce(function(r,i){var o=i.toLowerCase().split("-"),s=o[0],u=o.slice(1).join("-");if(s&&u==="h")return r.flipX=!0,r;if(s&&u==="v")return r.flipY=!0,r;if(u=parseFloat(u),isNaN(u))return r;switch(s){case"grow":r.size=r.size+u;break;case"shrink":r.size=r.size-u;break;case"left":r.x=r.x-u;break;case"right":r.x=r.x+u;break;case"up":r.y=r.y-u;break;case"down":r.y=r.y+u;break;case"rotate":r.rotate=r.rotate+u;break}return r},n)},uQ={mixout:function(){return{parse:{transform:function(n){return lE(n)}}}},hooks:function(){return{parseNodeAttributes:function(n,r){var i=r.getAttribute("data-fa-transform");return i&&(n.transform=lE(i)),n}}},provides:function(t){t.generateAbstractTransformGrouping=function(n){var r=n.main,i=n.transform,o=n.containerWidth,s=n.iconWidth,u={transform:"translate(".concat(o/2," 256)")},c="translate(".concat(i.x*32,", ").concat(i.y*32,") "),f="scale(".concat(i.size/16*(i.flipX?-1:1),", ").concat(i.size/16*(i.flipY?-1:1),") "),p="rotate(".concat(i.rotate," 0 0)"),h={transform:"".concat(c," ").concat(f," ").concat(p)},g={transform:"translate(".concat(s/2*-1," -256)")},v={outer:u,inner:h,path:g};return{tag:"g",attributes:fe({},v.outer),children:[{tag:"g",attributes:fe({},v.inner),children:[{tag:r.icon.tag,children:r.icon.children,attributes:fe(fe({},r.icon.attributes),v.path)}]}]}}}},zv={x:0,y:0,width:"100%",height:"100%"};function uE(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return e.attributes&&(e.attributes.fill||t)&&(e.attributes.fill="black"),e}function cQ(e){return e.tag==="g"?e.children:[e]}var fQ={hooks:function(){return{parseNodeAttributes:function(n,r){var i=r.getAttribute("data-fa-mask"),o=i?gm(i.split(" ").map(function(s){return s.trim()})):yb();return o.prefix||(o.prefix=ta()),n.mask=o,n.maskId=r.getAttribute("data-fa-mask-id"),n}}},provides:function(t){t.generateAbstractMask=function(n){var r=n.children,i=n.attributes,o=n.main,s=n.mask,u=n.maskId,c=n.transform,f=o.width,p=o.icon,h=s.width,g=s.icon,v=uX({transform:c,containerWidth:h,iconWidth:f}),y={tag:"rect",attributes:fe(fe({},zv),{},{fill:"white"})},b=p.children?{children:p.children.map(uE)}:{},C={tag:"g",attributes:fe({},v.inner),children:[uE(fe({tag:p.tag,attributes:fe(fe({},p.attributes),v.path)},b))]},x={tag:"g",attributes:fe({},v.outer),children:[C]},w="mask-".concat(u||Lc()),S="clip-".concat(u||Lc()),E={tag:"mask",attributes:fe(fe({},zv),{},{id:w,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[y,x]},I={tag:"defs",children:[{tag:"clipPath",attributes:{id:S},children:cQ(g)},E]};return r.push(I,{tag:"rect",attributes:fe({fill:"currentColor","clip-path":"url(#".concat(S,")"),mask:"url(#".concat(w,")")},zv)}),{children:r,attributes:i}}}},dQ={provides:function(t){var n=!1;ea.matchMedia&&(n=ea.matchMedia("(prefers-reduced-motion: reduce)").matches),t.missingIconAbstract=function(){var r=[],i={fill:"currentColor"},o={attributeType:"XML",repeatCount:"indefinite",dur:"2s"};r.push({tag:"path",attributes:fe(fe({},i),{},{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})});var s=fe(fe({},o),{},{attributeName:"opacity"}),u={tag:"circle",attributes:fe(fe({},i),{},{cx:"256",cy:"364",r:"28"}),children:[]};return n||u.children.push({tag:"animate",attributes:fe(fe({},o),{},{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:fe(fe({},s),{},{values:"1;0;1;1;0;1;"})}),r.push(u),r.push({tag:"path",attributes:fe(fe({},i),{},{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:n?[]:[{tag:"animate",attributes:fe(fe({},s),{},{values:"1;0;0;0;0;1;"})}]}),n||r.push({tag:"path",attributes:fe(fe({},i),{},{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:fe(fe({},s),{},{values:"0;0;1;1;0;0;"})}]}),{tag:"g",attributes:{class:"missing"},children:r}}}},pQ={hooks:function(){return{parseNodeAttributes:function(n,r){var i=r.getAttribute("data-fa-symbol"),o=i===null?!1:i===""?!0:i;return n.symbol=o,n}}}},hQ=[dX,JX,eQ,tQ,nQ,sQ,lQ,uQ,fQ,dQ,pQ];_X(hQ,{mixoutsTo:Er});Er.noAuto;Er.config;Er.library;Er.dom;var Ay=Er.parse;Er.findIconDefinition;Er.toHtml;var mQ=Er.icon;Er.layer;Er.text;Er.counter;function cE(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function Do(e){for(var t=1;t=0)&&(n[i]=e[i]);return n}function vQ(e,t){if(e==null)return{};var n=gQ(e,t),r,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&(!Object.prototype.propertyIsEnumerable.call(e,r)||(n[r]=e[r]))}return n}function My(e){return yQ(e)||xQ(e)||bQ(e)||wQ()}function yQ(e){if(Array.isArray(e))return $y(e)}function xQ(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function bQ(e,t){if(!!e){if(typeof e=="string")return $y(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $y(e,t)}}function $y(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n2&&arguments[2]!==void 0?arguments[2]:{};if(typeof t=="string")return t;var r=(t.children||[]).map(function(c){return fA(e,c)}),i=Object.keys(t.attributes||{}).reduce(function(c,f){var p=t.attributes[f];switch(f){case"class":c.attrs.className=p,delete t.attributes.class;break;case"style":c.attrs.style=OQ(p);break;default:f.indexOf("aria-")===0||f.indexOf("data-")===0?c.attrs[f.toLowerCase()]=p:c.attrs[cA(f)]=p}return c},{attrs:{}}),o=n.style,s=o===void 0?{}:o,u=vQ(n,CQ);return i.attrs.style=Do(Do({},i.attrs.style),s),e.apply(void 0,[t.tag,Do(Do({},i.attrs),u)].concat(My(r)))}var dA=!1;try{dA=!0}catch{}function _Q(){if(!dA&&console&&typeof console.error=="function"){var e;(e=console).error.apply(e,arguments)}}function fE(e){if(e&&rh(e)==="object"&&e.prefix&&e.iconName&&e.icon)return e;if(Ay.icon)return Ay.icon(e);if(e===null)return null;if(e&&rh(e)==="object"&&e.prefix&&e.iconName)return e;if(Array.isArray(e)&&e.length===2)return{prefix:e[0],iconName:e[1]};if(typeof e=="string")return{prefix:"fas",iconName:e}}function Bv(e,t){return Array.isArray(t)&&t.length>0||!Array.isArray(t)&&t?Hs({},e,t):{}}var $l=Ye.forwardRef(function(e,t){var n=e.icon,r=e.mask,i=e.symbol,o=e.className,s=e.title,u=e.titleId,c=e.maskId,f=fE(n),p=Bv("classes",[].concat(My(SQ(e)),My(o.split(" ")))),h=Bv("transform",typeof e.transform=="string"?Ay.transform(e.transform):e.transform),g=Bv("mask",fE(r)),v=mQ(f,Do(Do(Do(Do({},p),h),g),{},{symbol:i,title:s,titleId:u,maskId:c}));if(!v)return _Q("Could not find icon",f),null;var y=v.abstract,b={ref:t};return Object.keys(e).forEach(function(C){$l.defaultProps.hasOwnProperty(C)||(b[C]=e[C])}),PQ(y[0],b)});$l.displayName="FontAwesomeIcon";$l.propTypes={beat:se.exports.bool,border:se.exports.bool,beatFade:se.exports.bool,bounce:se.exports.bool,className:se.exports.string,fade:se.exports.bool,flash:se.exports.bool,mask:se.exports.oneOfType([se.exports.object,se.exports.array,se.exports.string]),maskId:se.exports.string,fixedWidth:se.exports.bool,inverse:se.exports.bool,flip:se.exports.oneOf([!0,!1,"horizontal","vertical","both"]),icon:se.exports.oneOfType([se.exports.object,se.exports.array,se.exports.string]),listItem:se.exports.bool,pull:se.exports.oneOf(["right","left"]),pulse:se.exports.bool,rotation:se.exports.oneOf([0,90,180,270]),shake:se.exports.bool,size:se.exports.oneOf(["2xs","xs","sm","lg","xl","2xl","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:se.exports.bool,spinPulse:se.exports.bool,spinReverse:se.exports.bool,symbol:se.exports.oneOfType([se.exports.bool,se.exports.string]),title:se.exports.string,titleId:se.exports.string,transform:se.exports.oneOfType([se.exports.string,se.exports.object]),swapOpacity:se.exports.bool};$l.defaultProps={border:!1,className:"",mask:null,maskId:null,fixedWidth:!1,inverse:!1,flip:!1,icon:null,listItem:!1,pull:null,pulse:!1,rotation:null,size:null,spin:!1,spinPulse:!1,spinReverse:!1,beat:!1,fade:!1,beatFade:!1,bounce:!1,shake:!1,symbol:!1,title:"",titleId:null,transform:null,swapOpacity:!1};var PQ=fA.bind(null,Ye.createElement);const Pt={},TQ=Ye.forwardRef(function(t,n){return N(MR,{direction:"up",ref:n,...t})}),IQ=({infoVisible:e,setInfoVisible:t})=>{const[n,r]=T.exports.useState(!1);return ge(Vq,{open:e,fullWidth:!0,maxWidth:"xs",onClose:()=>t(!1),TransitionComponent:TQ,children:[ge(fY,{children:[N("p",{children:Pt.ui_usefulcontrols}),N(sb,{className:"useful-controls-exit-button","aria-label":"close",onClick:()=>t(!1),children:N($l,{icon:NK})})]}),N(aY,{children:ge("div",{className:"useful-controls-content-wrapper",children:[ge("p",{children:[N("kbd",{children:"RMB"}),N("br",{}),Pt.ui_rmb]}),ge("p",{children:[N("kbd",{children:"ALT + LMB"}),N("br",{}),Pt.ui_alt_lmb]}),ge("p",{children:[N("kbd",{children:"CTRL + LMB"}),N("br",{}),Pt.ui_ctrl_lmb]}),ge("p",{children:[N("kbd",{children:"SHIFT + Drag"}),N("br",{}),Pt.ui_shift_drag]}),ge("p",{children:[N("kbd",{children:"CTRL + SHIFT + LMB"}),N("br",{}),Pt.ui_ctrl_shift_lmb]})]})}),N(Qq,{children:N("span",{onClick:()=>r(!0),children:"🐂"})}),N(SK,{open:n,onClose:()=>r(!1),autoHideDuration:2e3,anchorOrigin:{vertical:"top",horizontal:"center"},children:N(QG,{severity:"success",color:"info",sx:{width:"100%"},children:"Made with 🐂 by the Overextended team"})})]})},RQ=()=>{const e=Ja(N7),t=_l(),[n,r]=T.exports.useState(!1),[,i]=X0(()=>({accept:"SLOT",drop:u=>{u.inventory==="player"&&lb(u.item)}})),[,o]=X0(()=>({accept:"SLOT",drop:u=>{u.inventory==="player"&&NR(u.item)}}));return ge(Vr,{children:[N(IQ,{infoVisible:n,setInfoVisible:r}),N("div",{className:"inventory-control",children:ge("div",{className:"inventory-control-wrapper",children:[N("input",{className:"inventory-control-input",type:"number",defaultValue:e,onChange:u=>{(u.target.valueAsNumber%1!==0||isNaN(u.target.valueAsNumber)||u.target.valueAsNumber<0)&&(u.target.valueAsNumber=0),t(P7(u.target.valueAsNumber))}}),N("button",{className:"inventory-control-button",ref:i,children:Pt.ui_use||"Use"}),N("button",{className:"inventory-control-button",ref:o,children:Pt.ui_give||"Give"}),N("button",{className:"inventory-control-button",onClick:()=>Wr("exit"),children:Pt.ui_close||"Close"})]})}),N(sb,{className:"useful-controls-button",size:"large",onClick:()=>r(!0),children:N($l,{icon:$K})})]})},jv=(e,t,n)=>{let r=e*n,i=t*(1-n);return r+i},Ld=(e,t,n)=>{let r=jv(e[0],t[0],n),i=jv(e[1],t[1],n),o=jv(e[2],t[2],n);return`rgb(${r}, ${i}, ${o})`},Co={primaryColor:[231,76,60],secondColor:[39,174,96],accentColor:[211,84,0]},Sb=({percent:e,durability:t})=>{const n=Ye.useMemo(()=>t?e<50?Ld(Co.accentColor,Co.primaryColor,e/100):Ld(Co.secondColor,Co.accentColor,e/100):e>50?Ld(Co.primaryColor,Co.accentColor,e/100):Ld(Co.accentColor,Co.secondColor,e/50),[t,e]);return N("div",{className:t?"durability-bar":"weight-bar",children:N("div",{style:{visibility:e>0?"visible":"hidden",height:"100%",width:`${e}%`,backgroundColor:n,transition:`background ${.3}s ease, width ${.3}s ease`}})})},AQ=()=>{const[e,t]=T.exports.useState(!1),n=Ja(dT).items.slice(0,5),[r,i]=T.exports.useState();return Ci("toggleHotbar",()=>{e?t(!1):(r&&clearTimeout(r),t(!0),i(setTimeout(()=>t(!1),3e3)))}),N(MR,{in:e,direction:"up",unmountOnExit:!0,children:N("div",{className:"hotbar-container",children:n.map(o=>N("div",{className:"hotbar-item-slot",style:{backgroundImage:`url(${o?.name?Js(o):"none"}`},children:Fn(o)&&ge("div",{className:"item-slot-wrapper",children:[ge("div",{className:"hotbar-slot-header-wrapper",children:[N("div",{className:"inventory-slot-number",children:o.slot}),ge("div",{className:"item-slot-info-wrapper",children:[N("p",{children:o.weight>0?o.weight>=1e3?`${(o.weight/1e3).toLocaleString("en-us",{minimumFractionDigits:2})}kg `:`${o.weight.toLocaleString("en-us",{minimumFractionDigits:0})}g `:""}),N("p",{children:o.count?o.count.toLocaleString("en-us")+"x":""})]})]}),ge("div",{children:[o?.durability!==void 0&&N(Sb,{percent:o.durability,durability:!0}),N("div",{className:"inventory-slot-label-box",children:N("div",{className:"inventory-slot-label-text",children:o.metadata?.label?o.metadata.label:xt[o.name]?.label||o.name})})]})]})},`hotbar-${o.slot}`))})})},MQ=["Escape"],$Q=e=>{const t=T.exports.useRef(uT);T.exports.useEffect(()=>{t.current=e},[e]),T.exports.useEffect(()=>{const n=r=>{MQ.includes(r.code)&&(t.current(!1),Wr("exit"))};return window.addEventListener("keyup",n),()=>window.removeEventListener("keyup",n)},[])},DQ=ax("inventory/validateMove",async(e,{rejectWithValue:t,dispatch:n})=>{try{const r=await Wr("swapItems",e);if(r===!1)return t(r);typeof r=="number"&&n($7(r))}catch{return t(!1)}}),Dy=(e,t)=>{const{inventory:n}=hr.getState(),{sourceInventory:r,targetInventory:i}=Yh(n,e.inventory,t?.inventory),o=r.items[e.item.slot-1],s=xt[o.name];if(s===void 0)return console.error(`${o.name} item data undefined!`);if(o.metadata?.container!==void 0){if(i.type===Rn.CONTAINER)return console.log(`Cannot store container ${o.name} inside another container`);if(n.rightInventory.id===o.metadata.container)return console.log(`Cannot move container ${o.name} when opened`)}const u=t?i.items[t.item.slot-1]:x7(o,s,i.items);if(u===void 0)return console.error("Target slot undefined!");if(u.metadata?.container!==void 0&&n.rightInventory.id===u.metadata.container)return console.log(`Cannot swap item ${o.name} with container ${u.name} when opened`);const c=n.shiftPressed&&o.count>1&&r.type!=="shop"?Math.floor(o.count/2):n.itemAmount===0||n.itemAmount>o.count?o.count:n.itemAmount,f={fromSlot:o,toSlot:u,fromType:r.type,toType:i.type,count:c};hr.dispatch(DQ({...f,fromSlot:o.slot,toSlot:u.slot})),Fn(u,!0)?s.stack&&y7(o,u)?hr.dispatch(A7({...f,toSlot:u})):hr.dispatch(I7({...f,toSlot:u})):hr.dispatch(R7(f))},NQ=ax("inventory/buyItem",async(e,{rejectWithValue:t})=>{try{const n=await Wr("buyItem",e);if(n===!1)return t(n)}catch{return t(!1)}}),LQ=(e,t)=>{const{inventory:n}=hr.getState(),r=n.rightInventory,i=n.leftInventory,o=r.items[e.item.slot-1];if(!Fn(o))throw new Error(`Item ${o.slot} name === undefined`);if(o.count===0)return;if(xt[o.name]===void 0)return console.error(`Item ${o.name} data undefined!`);const u=i.items[t.item.slot-1];if(u===void 0)return console.error("Target slot undefined");const c=n.itemAmount!==0?o.count&&n.itemAmount>o.count?o.count:n.itemAmount:1,f={fromSlot:o,toSlot:u,fromType:r.type,toType:i.type,count:c};hr.dispatch(NQ({...f,fromSlot:o.slot,toSlot:u.slot}))},dE=["http","https","mailto","tel"];function FQ(e){const t=(e||"").trim(),n=t.charAt(0);if(n==="#"||n==="/")return t;const r=t.indexOf(":");if(r===-1)return t;let i=-1;for(;++ii||(i=t.indexOf("#"),i!==-1&&r>i)?t:"javascript:void(0)"}var pA=function(t){return t!=null&&t.constructor!=null&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)};function oc(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?pE(e.position):"start"in e||"end"in e?pE(e):"line"in e||"column"in e?Ny(e):""}function Ny(e){return hE(e&&e.line)+":"+hE(e&&e.column)}function pE(e){return Ny(e&&e.start)+"-"+Ny(e&&e.end)}function hE(e){return e&&typeof e=="number"?e:1}class Zr extends Error{constructor(t,n,r){const i=[null,null];let o={start:{line:null,column:null},end:{line:null,column:null}};if(super(),typeof n=="string"&&(r=n,n=void 0),typeof r=="string"){const s=r.indexOf(":");s===-1?i[1]=r:(i[0]=r.slice(0,s),i[1]=r.slice(s+1))}n&&("type"in n||"position"in n?n.position&&(o=n.position):"start"in n||"end"in n?o=n:("line"in n||"column"in n)&&(o.start=n)),this.name=oc(n)||"1:1",this.message=typeof t=="object"?t.message:t,this.stack="",typeof t=="object"&&t.stack&&(this.stack=t.stack),this.reason=this.message,this.fatal,this.line=o.start.line,this.column=o.start.column,this.position=o,this.source=i[0],this.ruleId=i[1],this.file,this.actual,this.expected,this.url,this.note}}Zr.prototype.file="";Zr.prototype.name="";Zr.prototype.reason="";Zr.prototype.message="";Zr.prototype.stack="";Zr.prototype.fatal=null;Zr.prototype.column=null;Zr.prototype.line=null;Zr.prototype.source=null;Zr.prototype.ruleId=null;Zr.prototype.position=null;const bi={basename:zQ,dirname:BQ,extname:jQ,join:WQ,sep:"/"};function zQ(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');nf(e);let n=0,r=-1,i=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.charCodeAt(i)===47){if(o){n=i+1;break}}else r<0&&(o=!0,r=i+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let s=-1,u=t.length-1;for(;i--;)if(e.charCodeAt(i)===47){if(o){n=i+1;break}}else s<0&&(o=!0,s=i+1),u>-1&&(e.charCodeAt(i)===t.charCodeAt(u--)?u<0&&(r=i):(u=-1,r=s));return n===r?r=s:r<0&&(r=e.length),e.slice(n,r)}function BQ(e){if(nf(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.charCodeAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.charCodeAt(0)===47?"/":".":t===1&&e.charCodeAt(0)===47?"//":e.slice(0,t)}function jQ(e){nf(e);let t=e.length,n=-1,r=0,i=-1,o=0,s;for(;t--;){const u=e.charCodeAt(t);if(u===47){if(s){r=t+1;break}continue}n<0&&(s=!0,n=t+1),u===46?i<0?i=t:o!==1&&(o=1):i>-1&&(o=-1)}return i<0||n<0||o===0||o===1&&i===n-1&&i===r+1?"":e.slice(i,n)}function WQ(...e){let t=-1,n;for(;++t0&&e.charCodeAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function HQ(e,t){let n="",r=0,i=-1,o=0,s=-1,u,c;for(;++s<=e.length;){if(s2){if(c=n.lastIndexOf("/"),c!==n.length-1){c<0?(n="",r=0):(n=n.slice(0,c),r=n.length-1-n.lastIndexOf("/")),i=s,o=0;continue}}else if(n.length>0){n="",r=0,i=s,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(i+1,s):n=e.slice(i+1,s),r=s-i-1;i=s,o=0}else u===46&&o>-1?o++:o=-1}return n}function nf(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const VQ={cwd:GQ};function GQ(){return"/"}function Ly(e){return e!==null&&typeof e=="object"&&e.href&&e.origin}function qQ(e){if(typeof e=="string")e=new URL(e);else if(!Ly(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return YQ(e)}function YQ(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n"u"||cp.call(t,i)},wE=function(t,n){vE&&n.name==="__proto__"?vE(t,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):t[n.name]=n.newValue},SE=function(t,n){if(n==="__proto__")if(cp.call(t,n)){if(yE)return yE(t,n).value}else return;return t[n]},kE=function e(){var t,n,r,i,o,s,u=arguments[0],c=1,f=arguments.length,p=!1;for(typeof u=="boolean"&&(p=u,u=arguments[1]||{},c=2),(u==null||typeof u!="object"&&typeof u!="function")&&(u={});cs.length;let c;u&&s.push(i);try{c=e.apply(this,s)}catch(f){const p=f;if(u&&n)throw p;return i(p)}u||(c instanceof Promise?c.then(o,i):c instanceof Error?i(c):o(c))}function i(s,...u){n||(n=!0,t(s,...u))}function o(s){i(null,s)}}const QQ=vA().freeze(),gA={}.hasOwnProperty;function vA(){const e=KQ(),t=[];let n={},r,i=-1;return o.data=s,o.Parser=void 0,o.Compiler=void 0,o.freeze=u,o.attachers=t,o.use=c,o.parse=f,o.stringify=p,o.run=h,o.runSync=g,o.process=v,o.processSync=y,o;function o(){const b=vA();let C=-1;for(;++C{if(_||!R||!D)I(_);else{const W=o.stringify(R,D);W==null||(eZ(W)?D.value=W:D.result=W),I(_,D)}});function I(_,R){_||!R?S(_):w?w(R):C(null,R)}}}function y(b){let C;o.freeze(),Vv("processSync",o.Parser),Gv("processSync",o.Compiler);const x=bu(b);return o.process(x,w),OE("processSync","process",C),x;function w(S){C=!0,gE(S)}}}function CE(e,t){return typeof e=="function"&&e.prototype&&(ZQ(e.prototype)||t in e.prototype)}function ZQ(e){let t;for(t in e)if(gA.call(e,t))return!0;return!1}function Vv(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `Parser`")}function Gv(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `Compiler`")}function qv(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function EE(e){if(!Fy(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function OE(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function bu(e){return JQ(e)?e:new hA(e)}function JQ(e){return Boolean(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function eZ(e){return typeof e=="string"||pA(e)}function tZ(e,t){var{includeImageAlt:n=!0}=t||{};return yA(e,n)}function yA(e,t){return e&&typeof e=="object"&&(e.value||(t?e.alt:"")||"children"in e&&_E(e.children,t)||Array.isArray(e)&&_E(e,t))||""}function _E(e,t){for(var n=[],r=-1;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)s=Array.from(r),s.unshift(t,n),[].splice.apply(e,s);else for(n&&[].splice.apply(e,[t,n]);o0?($i(e,e.length,0,t),e):t}const PE={}.hasOwnProperty;function nZ(e){const t={};let n=-1;for(;++ns))return;const R=t.events.length;let D=R,W,L;for(;D--;)if(t.events[D][0]==="exit"&&t.events[D][1].type==="chunkFlow"){if(W){L=t.events[D][1].end;break}W=!0}for(x(r),_=R;_S;){const I=n[E];t.containerState=I[1],I[0].exit.call(t,e)}n.length=S}function w(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function hZ(e,t,n){return gt(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function RE(e){if(e===null||Hr(e)||lZ(e))return 1;if(uZ(e))return 2}function kb(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const h=Object.assign({},e[r][1].end),g=Object.assign({},e[n][1].start);AE(h,-c),AE(g,c),s={type:c>1?"strongSequence":"emphasisSequence",start:h,end:Object.assign({},e[r][1].end)},u={type:c>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[n][1].start),end:g},o={type:c>1?"strongText":"emphasisText",start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},i={type:c>1?"strong":"emphasis",start:Object.assign({},s.start),end:Object.assign({},u.end)},e[r][1].end=Object.assign({},s.start),e[n][1].start=Object.assign({},u.end),f=[],e[r][1].end.offset-e[r][1].start.offset&&(f=zr(f,[["enter",e[r][1],t],["exit",e[r][1],t]])),f=zr(f,[["enter",i,t],["enter",s,t],["exit",s,t],["enter",o,t]]),f=zr(f,kb(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),f=zr(f,[["exit",o,t],["enter",u,t],["exit",u,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(p=2,f=zr(f,[["enter",e[n][1],t],["exit",e[n][1],t]])):p=0,$i(e,r-1,n-r+3,f),n=r+f.length-p-2;break}}for(n=-1;++n=4?s(f):n(f)}function s(f){return f===null?c(f):Te(f)?e.attempt(OZ,s,c)(f):(e.enter("codeFlowValue"),u(f))}function u(f){return f===null||Te(f)?(e.exit("codeFlowValue"),s(f)):(e.consume(f),u)}function c(f){return e.exit("codeIndented"),t(f)}}function PZ(e,t,n){const r=this;return i;function i(s){return r.parser.lazy[r.now().line]?n(s):Te(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),i):gt(e,o,"linePrefix",4+1)(s)}function o(s){const u=r.events[r.events.length-1];return u&&u[1].type==="linePrefix"&&u[2].sliceSerialize(u[1],!0).length>=4?t(s):Te(s)?i(s):n(s)}}const TZ={name:"codeText",tokenize:AZ,resolve:IZ,previous:RZ};function IZ(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=4?t(s):e.interrupt(r.parser.constructs.flow,n,t)(s)}}function kA(e,t,n,r,i,o,s,u,c){const f=c||Number.POSITIVE_INFINITY;let p=0;return h;function h(x){return x===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(x),e.exit(o),g):x===null||x===41||By(x)?n(x):(e.enter(r),e.enter(s),e.enter(u),e.enter("chunkString",{contentType:"string"}),b(x))}function g(x){return x===62?(e.enter(o),e.consume(x),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(u),e.enter("chunkString",{contentType:"string"}),v(x))}function v(x){return x===62?(e.exit("chunkString"),e.exit(u),g(x)):x===null||x===60||Te(x)?n(x):(e.consume(x),x===92?y:v)}function y(x){return x===60||x===62||x===92?(e.consume(x),v):v(x)}function b(x){return x===40?++p>f?n(x):(e.consume(x),b):x===41?p--?(e.consume(x),b):(e.exit("chunkString"),e.exit(u),e.exit(s),e.exit(r),t(x)):x===null||Hr(x)?p?n(x):(e.exit("chunkString"),e.exit(u),e.exit(s),e.exit(r),t(x)):By(x)?n(x):(e.consume(x),x===92?C:b)}function C(x){return x===40||x===41||x===92?(e.consume(x),b):b(x)}}function CA(e,t,n,r,i,o){const s=this;let u=0,c;return f;function f(v){return e.enter(r),e.enter(i),e.consume(v),e.exit(i),e.enter(o),p}function p(v){return v===null||v===91||v===93&&!c||v===94&&!u&&"_hiddenFootnoteSupport"in s.parser.constructs||u>999?n(v):v===93?(e.exit(o),e.enter(i),e.consume(v),e.exit(i),e.exit(r),t):Te(v)?(e.enter("lineEnding"),e.consume(v),e.exit("lineEnding"),p):(e.enter("chunkString",{contentType:"string"}),h(v))}function h(v){return v===null||v===91||v===93||Te(v)||u++>999?(e.exit("chunkString"),p(v)):(e.consume(v),c=c||!Jt(v),v===92?g:h)}function g(v){return v===91||v===92||v===93?(e.consume(v),u++,h):h(v)}}function EA(e,t,n,r,i,o){let s;return u;function u(g){return e.enter(r),e.enter(i),e.consume(g),e.exit(i),s=g===40?41:g,c}function c(g){return g===s?(e.enter(i),e.consume(g),e.exit(i),e.exit(r),t):(e.enter(o),f(g))}function f(g){return g===s?(e.exit(o),c(s)):g===null?n(g):Te(g)?(e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),gt(e,f,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),p(g))}function p(g){return g===s||g===null||Te(g)?(e.exit("chunkString"),f(g)):(e.consume(g),g===92?h:p)}function h(g){return g===s||g===92?(e.consume(g),p):p(g)}}function ac(e,t){let n;return r;function r(i){return Te(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):Jt(i)?gt(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}function rl(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const zZ={name:"definition",tokenize:jZ},BZ={tokenize:WZ,partial:!0};function jZ(e,t,n){const r=this;let i;return o;function o(c){return e.enter("definition"),CA.call(r,e,s,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(c)}function s(c){return i=rl(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),c===58?(e.enter("definitionMarker"),e.consume(c),e.exit("definitionMarker"),ac(e,kA(e,e.attempt(BZ,gt(e,u,"whitespace"),gt(e,u,"whitespace")),n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString"))):n(c)}function u(c){return c===null||Te(c)?(e.exit("definition"),r.parser.defined.includes(i)||r.parser.defined.push(i),t(c)):n(c)}}function WZ(e,t,n){return r;function r(s){return Hr(s)?ac(e,i)(s):n(s)}function i(s){return s===34||s===39||s===40?EA(e,gt(e,o,"whitespace"),n,"definitionTitle","definitionTitleMarker","definitionTitleString")(s):n(s)}function o(s){return s===null||Te(s)?t(s):n(s)}}const UZ={name:"hardBreakEscape",tokenize:HZ};function HZ(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.enter("escapeMarker"),e.consume(o),i}function i(o){return Te(o)?(e.exit("escapeMarker"),e.exit("hardBreakEscape"),t(o)):n(o)}}const VZ={name:"headingAtx",tokenize:qZ,resolve:GZ};function GZ(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},$i(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function qZ(e,t,n){const r=this;let i=0;return o;function o(p){return e.enter("atxHeading"),e.enter("atxHeadingSequence"),s(p)}function s(p){return p===35&&i++<6?(e.consume(p),s):p===null||Hr(p)?(e.exit("atxHeadingSequence"),r.interrupt?t(p):u(p)):n(p)}function u(p){return p===35?(e.enter("atxHeadingSequence"),c(p)):p===null||Te(p)?(e.exit("atxHeading"),t(p)):Jt(p)?gt(e,u,"whitespace")(p):(e.enter("atxHeadingText"),f(p))}function c(p){return p===35?(e.consume(p),c):(e.exit("atxHeadingSequence"),u(p))}function f(p){return p===null||p===35||Hr(p)?(e.exit("atxHeadingText"),u(p)):(e.consume(p),f)}}const YZ=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],DE=["pre","script","style","textarea"],KZ={name:"htmlFlow",tokenize:ZZ,resolveTo:QZ,concrete:!0},XZ={tokenize:JZ,partial:!0};function QZ(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function ZZ(e,t,n){const r=this;let i,o,s,u,c;return f;function f(M){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(M),p}function p(M){return M===33?(e.consume(M),h):M===47?(e.consume(M),y):M===63?(e.consume(M),i=3,r.interrupt?t:Q):Ei(M)?(e.consume(M),s=String.fromCharCode(M),o=!0,b):n(M)}function h(M){return M===45?(e.consume(M),i=2,g):M===91?(e.consume(M),i=5,s="CDATA[",u=0,v):Ei(M)?(e.consume(M),i=4,r.interrupt?t:Q):n(M)}function g(M){return M===45?(e.consume(M),r.interrupt?t:Q):n(M)}function v(M){return M===s.charCodeAt(u++)?(e.consume(M),u===s.length?r.interrupt?t:B:v):n(M)}function y(M){return Ei(M)?(e.consume(M),s=String.fromCharCode(M),b):n(M)}function b(M){return M===null||M===47||M===62||Hr(M)?M!==47&&o&&DE.includes(s.toLowerCase())?(i=1,r.interrupt?t(M):B(M)):YZ.includes(s.toLowerCase())?(i=6,M===47?(e.consume(M),C):r.interrupt?t(M):B(M)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(M):o?w(M):x(M)):M===45||gr(M)?(e.consume(M),s+=String.fromCharCode(M),b):n(M)}function C(M){return M===62?(e.consume(M),r.interrupt?t:B):n(M)}function x(M){return Jt(M)?(e.consume(M),x):W(M)}function w(M){return M===47?(e.consume(M),W):M===58||M===95||Ei(M)?(e.consume(M),S):Jt(M)?(e.consume(M),w):W(M)}function S(M){return M===45||M===46||M===58||M===95||gr(M)?(e.consume(M),S):E(M)}function E(M){return M===61?(e.consume(M),I):Jt(M)?(e.consume(M),E):w(M)}function I(M){return M===null||M===60||M===61||M===62||M===96?n(M):M===34||M===39?(e.consume(M),c=M,_):Jt(M)?(e.consume(M),I):(c=null,R(M))}function _(M){return M===null||Te(M)?n(M):M===c?(e.consume(M),D):(e.consume(M),_)}function R(M){return M===null||M===34||M===39||M===60||M===61||M===62||M===96||Hr(M)?E(M):(e.consume(M),R)}function D(M){return M===47||M===62||Jt(M)?w(M):n(M)}function W(M){return M===62?(e.consume(M),L):n(M)}function L(M){return Jt(M)?(e.consume(M),L):M===null||Te(M)?B(M):n(M)}function B(M){return M===45&&i===2?(e.consume(M),te):M===60&&i===1?(e.consume(M),oe):M===62&&i===4?(e.consume(M),K):M===63&&i===3?(e.consume(M),Q):M===93&&i===5?(e.consume(M),H):Te(M)&&(i===6||i===7)?e.check(XZ,K,Y)(M):M===null||Te(M)?Y(M):(e.consume(M),B)}function Y(M){return e.exit("htmlFlowData"),Z(M)}function Z(M){return M===null?A(M):Te(M)?e.attempt({tokenize:re,partial:!0},Z,A)(M):(e.enter("htmlFlowData"),B(M))}function re(M,we,xe){return Se;function Se(Ae){return M.enter("lineEnding"),M.consume(Ae),M.exit("lineEnding"),me}function me(Ae){return r.parser.lazy[r.now().line]?xe(Ae):we(Ae)}}function te(M){return M===45?(e.consume(M),Q):B(M)}function oe(M){return M===47?(e.consume(M),s="",le):B(M)}function le(M){return M===62&&DE.includes(s.toLowerCase())?(e.consume(M),K):Ei(M)&&s.length<8?(e.consume(M),s+=String.fromCharCode(M),le):B(M)}function H(M){return M===93?(e.consume(M),Q):B(M)}function Q(M){return M===62?(e.consume(M),K):M===45&&i===2?(e.consume(M),Q):B(M)}function K(M){return M===null||Te(M)?(e.exit("htmlFlowData"),A(M)):(e.consume(M),K)}function A(M){return e.exit("htmlFlow"),t(M)}}function JZ(e,t,n){return r;function r(i){return e.exit("htmlFlowData"),e.enter("lineEndingBlank"),e.consume(i),e.exit("lineEndingBlank"),e.attempt(ym,t,n)}}const eJ={name:"htmlText",tokenize:tJ};function tJ(e,t,n){const r=this;let i,o,s,u;return c;function c(A){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(A),f}function f(A){return A===33?(e.consume(A),p):A===47?(e.consume(A),R):A===63?(e.consume(A),I):Ei(A)?(e.consume(A),L):n(A)}function p(A){return A===45?(e.consume(A),h):A===91?(e.consume(A),o="CDATA[",s=0,C):Ei(A)?(e.consume(A),E):n(A)}function h(A){return A===45?(e.consume(A),g):n(A)}function g(A){return A===null||A===62?n(A):A===45?(e.consume(A),v):y(A)}function v(A){return A===null||A===62?n(A):y(A)}function y(A){return A===null?n(A):A===45?(e.consume(A),b):Te(A)?(u=y,H(A)):(e.consume(A),y)}function b(A){return A===45?(e.consume(A),K):y(A)}function C(A){return A===o.charCodeAt(s++)?(e.consume(A),s===o.length?x:C):n(A)}function x(A){return A===null?n(A):A===93?(e.consume(A),w):Te(A)?(u=x,H(A)):(e.consume(A),x)}function w(A){return A===93?(e.consume(A),S):x(A)}function S(A){return A===62?K(A):A===93?(e.consume(A),S):x(A)}function E(A){return A===null||A===62?K(A):Te(A)?(u=E,H(A)):(e.consume(A),E)}function I(A){return A===null?n(A):A===63?(e.consume(A),_):Te(A)?(u=I,H(A)):(e.consume(A),I)}function _(A){return A===62?K(A):I(A)}function R(A){return Ei(A)?(e.consume(A),D):n(A)}function D(A){return A===45||gr(A)?(e.consume(A),D):W(A)}function W(A){return Te(A)?(u=W,H(A)):Jt(A)?(e.consume(A),W):K(A)}function L(A){return A===45||gr(A)?(e.consume(A),L):A===47||A===62||Hr(A)?B(A):n(A)}function B(A){return A===47?(e.consume(A),K):A===58||A===95||Ei(A)?(e.consume(A),Y):Te(A)?(u=B,H(A)):Jt(A)?(e.consume(A),B):K(A)}function Y(A){return A===45||A===46||A===58||A===95||gr(A)?(e.consume(A),Y):Z(A)}function Z(A){return A===61?(e.consume(A),re):Te(A)?(u=Z,H(A)):Jt(A)?(e.consume(A),Z):B(A)}function re(A){return A===null||A===60||A===61||A===62||A===96?n(A):A===34||A===39?(e.consume(A),i=A,te):Te(A)?(u=re,H(A)):Jt(A)?(e.consume(A),re):(e.consume(A),i=void 0,le)}function te(A){return A===i?(e.consume(A),oe):A===null?n(A):Te(A)?(u=te,H(A)):(e.consume(A),te)}function oe(A){return A===62||A===47||Hr(A)?B(A):n(A)}function le(A){return A===null||A===34||A===39||A===60||A===61||A===96?n(A):A===62||Hr(A)?B(A):(e.consume(A),le)}function H(A){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(A),e.exit("lineEnding"),gt(e,Q,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Q(A){return e.enter("htmlTextData"),u(A)}function K(A){return A===62?(e.consume(A),e.exit("htmlTextData"),e.exit("htmlText"),t):n(A)}}const Eb={name:"labelEnd",tokenize:sJ,resolveTo:aJ,resolveAll:oJ},nJ={tokenize:lJ},rJ={tokenize:uJ},iJ={tokenize:cJ};function oJ(e){let t=-1,n;for(;++t-1&&(s[0]=s[0].slice(r)),o>0&&s.push(e[i].slice(0,o))),s}function $J(e,t){let n=-1;const r=[];let i;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCharCode(n)}const YJ=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function KJ(e){return e.replace(YJ,XJ)}function XJ(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const i=n.charCodeAt(1),o=i===120||i===88;return PA(n.slice(o?2:1),o?16:10)}return Cb(n)||e}const Wy={}.hasOwnProperty,QJ=function(e,t,n){return typeof t!="string"&&(n=t,t=void 0),ZJ(n)(qJ(VJ(n).document().write(GJ()(e,t,!0))))};function ZJ(e={}){const t=TA({transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:c(Qe),autolinkProtocol:Y,autolinkEmail:Y,atxHeading:c(pt),blockQuote:c(qt),characterEscape:Y,characterReference:Y,codeFenced:c(Yt),codeFencedFenceInfo:f,codeFencedFenceMeta:f,codeIndented:c(Yt,f),codeText:c(it,f),codeTextData:Y,data:Y,codeFlowValue:Y,definition:c(dt),definitionDestinationString:f,definitionLabelString:f,definitionTitleString:f,emphasis:c(kn),hardBreakEscape:c(ot),hardBreakTrailing:c(ot),htmlFlow:c(Wn,f),htmlFlowData:Y,htmlText:c(Wn,f),htmlTextData:Y,image:c(Ze),label:f,link:c(Qe),listItem:c(ln),listItemValue:b,listOrdered:c(Kt,y),listUnordered:c(Kt),paragraph:c(Xt),reference:me,referenceString:f,resourceDestinationString:f,resourceTitleString:f,setextHeading:c(pt),strong:c(ht),thematicBreak:c(vt)},exit:{atxHeading:h(),atxHeadingSequence:D,autolink:h(),autolinkEmail:Ie,autolinkProtocol:We,blockQuote:h(),characterEscapeValue:Z,characterReferenceMarkerHexadecimal:Pe,characterReferenceMarkerNumeric:Pe,characterReferenceValue:de,codeFenced:h(S),codeFencedFence:w,codeFencedFenceInfo:C,codeFencedFenceMeta:x,codeFlowValue:Z,codeIndented:h(E),codeText:h(H),codeTextData:Z,data:Z,definition:h(),definitionDestinationString:R,definitionLabelString:I,definitionTitleString:_,emphasis:h(),hardBreakEscape:h(te),hardBreakTrailing:h(te),htmlFlow:h(oe),htmlFlowData:Z,htmlText:h(le),htmlTextData:Z,image:h(K),label:M,labelText:A,lineEnding:re,link:h(Q),listItem:h(),listOrdered:h(),listUnordered:h(),paragraph:h(),referenceString:Ae,resourceDestinationString:we,resourceTitleString:xe,resource:Se,setextHeading:h(B),setextHeadingLineSequence:L,setextHeadingText:W,strong:h(),thematicBreak:h()}},e.mdastExtensions||[]),n={};return r;function r(V){let q={type:"root",children:[]};const be=[q],Ce=[],ft=[],nr={stack:be,tokenStack:Ce,config:t,enter:p,exit:g,buffer:f,resume:v,setData:o,getData:s};let Ke=-1;for(;++Ke0){const St=Ce[Ce.length-1];(St[1]||FE).call(nr,void 0,St[0])}for(q.position={start:u(V.length>0?V[0][1].start:{line:1,column:1,offset:0}),end:u(V.length>0?V[V.length-2][1].end:{line:1,column:1,offset:0})},Ke=-1;++Ke{const r=this.data("settings");return QJ(n,Object.assign({},r,e,{extensions:this.data("micromarkExtensions")||[],mdastExtensions:this.data("fromMarkdownExtensions")||[]}))}})}var an=function(e,t,n){var r={type:String(e)};return n==null&&(typeof t=="string"||Array.isArray(t))?n=t:Object.assign(r,t),Array.isArray(n)?r.children=n:n!=null&&(r.value=String(n)),r};const dp={}.hasOwnProperty;function tee(e,t){const n=t.data||{};return"value"in t&&!(dp.call(n,"hName")||dp.call(n,"hProperties")||dp.call(n,"hChildren"))?e.augment(t,an("text",t.value)):e(t,"div",Mn(e,t))}function IA(e,t,n){const r=t&&t.type;let i;if(!r)throw new Error("Expected node, got `"+t+"`");return dp.call(e.handlers,r)?i=e.handlers[r]:e.passThrough&&e.passThrough.includes(r)?i=nee:i=e.unknownHandler,(typeof i=="function"?i:tee)(e,t,n)}function nee(e,t){return"children"in t?{...t,children:Mn(e,t)}:t}function Mn(e,t){const n=[];if("children"in t){const r=t.children;let i=-1;for(;++i":""))+")"})),g;function g(){let v=[],y,b,C;if((!t||i(u,c,f[f.length-1]||null))&&(v=cee(n(u,f)),v[0]===zE))return v;if(u.children&&v[0]!==lee)for(b=(r?u.children.length:-1)+o,C=f.concat(u);b>-1&&b-1?r.offset:null}}}function fee(e){return!e||!e.position||!e.position.start||!e.position.start.line||!e.position.start.column||!e.position.end||!e.position.end.line||!e.position.end.column}const BE={}.hasOwnProperty;function dee(e){const t=Object.create(null);if(!e||!e.type)throw new Error("mdast-util-definitions expected node");return Ob(e,"definition",r=>{const i=jE(r.identifier);i&&!BE.call(t,i)&&(t[i]=r)}),n;function n(r){const i=jE(r);return i&&BE.call(t,i)?t[i]:null}}function jE(e){return String(e||"").toUpperCase()}function Dl(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const u=e.charCodeAt(n+1);o<56320&&u>56319&&u<57344?(s=String.fromCharCode(o,u),i=1):s="�"}else s=String.fromCharCode(o);s&&(t.push(e.slice(r,n),encodeURIComponent(s)),r=n+i+1,s=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function Xi(e,t){const n=[];let r=-1;for(t&&n.push(an("text",` -`));++r0&&n.push(an("text",` -`)),n}function pee(e){let t=-1;const n=[];for(;++t1?"-"+u:""),dataFootnoteBackref:!0,className:["data-footnote-backref"],ariaLabel:e.footnoteBackLabel},children:[{type:"text",value:"↩"}]};u>1&&h.children.push({type:"element",tagName:"sup",children:[{type:"text",value:String(u)}]}),c.length>0&&c.push({type:"text",value:" "}),c.push(h)}const f=i[i.length-1];if(f&&f.type==="element"&&f.tagName==="p"){const h=f.children[f.children.length-1];h&&h.type==="text"?h.value+=" ":f.children.push({type:"text",value:" "}),f.children.push(...c)}else i.push(...c);const p={type:"element",tagName:"li",properties:{id:e.clobberPrefix+"fn-"+s},children:Xi(i,!0)};r.position&&(p.position=r.position),n.push(p)}return n.length===0?null:{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:e.footnoteLabelTagName,properties:{...JSON.parse(JSON.stringify(e.footnoteLabelProperties)),id:"footnote-label"},children:[an("text",e.footnoteLabel)]},{type:"text",value:` -`},{type:"element",tagName:"ol",properties:{},children:Xi(n,!0)},{type:"text",value:` -`}]}}function hee(e,t){return e(t,"blockquote",Xi(Mn(e,t),!0))}function mee(e,t){return[e(t,"br"),an("text",` -`)]}function gee(e,t){const n=t.value?t.value+` -`:"",r=t.lang&&t.lang.match(/^[^ \t]+(?=[ \t]|$)/),i={};r&&(i.className=["language-"+r]);const o=e(t,"code",i,[an("text",n)]);return t.meta&&(o.data={meta:t.meta}),e(t.position,"pre",[o])}function vee(e,t){return e(t,"del",Mn(e,t))}function yee(e,t){return e(t,"em",Mn(e,t))}function DA(e,t){const n=String(t.identifier),r=Dl(n.toLowerCase()),i=e.footnoteOrder.indexOf(n);let o;i===-1?(e.footnoteOrder.push(n),e.footnoteCounts[n]=1,o=e.footnoteOrder.length):(e.footnoteCounts[n]++,o=i+1);const s=e.footnoteCounts[n];return e(t,"sup",[e(t.position,"a",{href:"#"+e.clobberPrefix+"fn-"+r,id:e.clobberPrefix+"fnref-"+r+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:"footnote-label"},[an("text",String(o))])])}function xee(e,t){const n=e.footnoteById;let r=1;for(;r in n;)r++;const i=String(r);return n[i]={type:"footnoteDefinition",identifier:i,children:[{type:"paragraph",children:t.children}],position:t.position},DA(e,{type:"footnoteReference",identifier:i,position:t.position})}function bee(e,t){return e(t,"h"+t.depth,Mn(e,t))}function wee(e,t){return e.dangerous?e.augment(t,an("raw",t.value)):null}function NA(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return an("text","!["+t.alt+r);const i=Mn(e,t),o=i[0];o&&o.type==="text"?o.value="["+o.value:i.unshift(an("text","["));const s=i[i.length-1];return s&&s.type==="text"?s.value+=r:i.push(an("text",r)),i}function See(e,t){const n=e.definition(t.identifier);if(!n)return NA(e,t);const r={src:Dl(n.url||""),alt:t.alt};return n.title!==null&&n.title!==void 0&&(r.title=n.title),e(t,"img",r)}function kee(e,t){const n={src:Dl(t.url),alt:t.alt};return t.title!==null&&t.title!==void 0&&(n.title=t.title),e(t,"img",n)}function Cee(e,t){return e(t,"code",[an("text",t.value.replace(/\r?\n|\r/g," "))])}function Eee(e,t){const n=e.definition(t.identifier);if(!n)return NA(e,t);const r={href:Dl(n.url||"")};return n.title!==null&&n.title!==void 0&&(r.title=n.title),e(t,"a",r,Mn(e,t))}function Oee(e,t){const n={href:Dl(t.url)};return t.title!==null&&t.title!==void 0&&(n.title=t.title),e(t,"a",n,Mn(e,t))}function _ee(e,t,n){const r=Mn(e,t),i=n?Pee(n):LA(t),o={},s=[];if(typeof t.checked=="boolean"){let f;r[0]&&r[0].type==="element"&&r[0].tagName==="p"?f=r[0]:(f=e(null,"p",[]),r.unshift(f)),f.children.length>0&&f.children.unshift(an("text"," ")),f.children.unshift(e(null,"input",{type:"checkbox",checked:t.checked,disabled:!0})),o.className=["task-list-item"]}let u=-1;for(;++u1}function Tee(e,t){const n={},r=t.ordered?"ol":"ul",i=Mn(e,t);let o=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++o0,!0),r[0]),i=r.index+r[0].length,r=n.exec(t);return o.push(HE(t.slice(i),i>0,!1)),o.join("")}function HE(e,t,n){let r=0,i=e.length;if(t){let o=e.codePointAt(r);for(;o===WE||o===UE;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(i-1);for(;o===WE||o===UE;)i--,o=e.codePointAt(i-1)}return i>r?e.slice(r,i):""}function Dee(e,t){return e.augment(t,an("text",$ee(String(t.value))))}function Nee(e,t){return e(t,"hr")}const Lee={blockquote:hee,break:mee,code:gee,delete:vee,emphasis:yee,footnoteReference:DA,footnote:xee,heading:bee,html:wee,imageReference:See,image:kee,inlineCode:Cee,linkReference:Eee,link:Oee,listItem:_ee,list:Tee,paragraph:Iee,root:Ree,strong:Aee,table:Mee,text:Dee,thematicBreak:Nee,toml:Fd,yaml:Fd,definition:Fd,footnoteDefinition:Fd};function Fd(){return null}const Fee={}.hasOwnProperty;function zee(e,t){const n=t||{},r=n.allowDangerousHtml||!1,i={};return s.dangerous=r,s.clobberPrefix=n.clobberPrefix===void 0||n.clobberPrefix===null?"user-content-":n.clobberPrefix,s.footnoteLabel=n.footnoteLabel||"Footnotes",s.footnoteLabelTagName=n.footnoteLabelTagName||"h2",s.footnoteLabelProperties=n.footnoteLabelProperties||{className:["sr-only"]},s.footnoteBackLabel=n.footnoteBackLabel||"Back to content",s.definition=dee(e),s.footnoteById=i,s.footnoteOrder=[],s.footnoteCounts={},s.augment=o,s.handlers={...Lee,...n.handlers},s.unknownHandler=n.unknownHandler,s.passThrough=n.passThrough,Ob(e,"footnoteDefinition",u=>{const c=String(u.identifier).toUpperCase();Fee.call(i,c)||(i[c]=u)}),s;function o(u,c){if(u&&"data"in u&&u.data){const f=u.data;f.hName&&(c.type!=="element"&&(c={type:"element",tagName:"",properties:{},children:[]}),c.tagName=f.hName),c.type==="element"&&f.hProperties&&(c.properties={...c.properties,...f.hProperties}),"children"in c&&c.children&&f.hChildren&&(c.children=f.hChildren)}if(u){const f="type"in u?u:{position:u};fee(f)||(c.position={start:AA(f),end:MA(f)})}return c}function s(u,c,f,p){return Array.isArray(f)&&(p=f,f={}),o(u,{type:"element",tagName:c,properties:f||{},children:p||[]})}}function FA(e,t){const n=zee(e,t),r=IA(n,e,null),i=pee(n);return i&&r.children.push(an("text",` -`),i),Array.isArray(r)?{type:"root",children:r}:r}const Bee=function(e,t){return e&&"run"in e?Wee(e,t):Uee(e||t)},jee=Bee;function Wee(e,t){return(n,r,i)=>{e.run(FA(n,t),r,o=>{i(o)})}}function Uee(e){return t=>FA(t,e)}class rf{constructor(t,n,r){this.property=t,this.normal=n,r&&(this.space=r)}}rf.prototype.property={};rf.prototype.normal={};rf.prototype.space=null;function zA(e,t){const n={},r={};let i=-1;for(;++i4&&n.slice(0,4)==="data"&&Yee.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(GE,Zee);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!GE.test(o)){let s=o.replace(Kee,Qee);s.charAt(0)!=="-"&&(s="-"+s),t="data"+s}}i=_b}return new i(r,t)}function Qee(e){return"-"+e.toLowerCase()}function Zee(e){return e.charAt(1).toUpperCase()}const qE={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"},Jee=zA([WA,jA,VA,GA,Gee],"html"),ete=zA([WA,jA,VA,GA,qee],"svg");function tte(e){if(e.allowedElements&&e.disallowedElements)throw new TypeError("Only one of `allowedElements` and `disallowedElements` should be defined");if(e.allowedElements||e.disallowedElements||e.allowElement)return t=>{Ob(t,"element",(n,r,i)=>{const o=i;let s;if(e.allowedElements?s=!e.allowedElements.includes(n.tagName):e.disallowedElements&&(s=e.disallowedElements.includes(n.tagName)),!s&&e.allowElement&&typeof r=="number"&&(s=!e.allowElement(n,r,o)),s&&typeof r=="number")return e.unwrapDisallowed&&n.children?o.children.splice(r,1,...n.children):o.children.splice(r,1),r})}}function nte(e){var t=e&&typeof e=="object"&&e.type==="text"?e.value||"":e;return typeof t=="string"&&t.replace(/[ \t\n\f\r]/g,"")===""}function rte(e){return e.join(" ").trim()}function ite(e,t){const n=t||{};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}var YE=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,ote=/\n/g,ate=/^\s*/,ste=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,lte=/^:\s*/,ute=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,cte=/^[;\s]*/,fte=/^\s+|\s+$/g,dte=` -`,KE="/",XE="*",Ta="",pte="comment",hte="declaration",mte=function(e,t){if(typeof e!="string")throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var n=1,r=1;function i(y){var b=y.match(ote);b&&(n+=b.length);var C=y.lastIndexOf(dte);r=~C?y.length-C:r+y.length}function o(){var y={line:n,column:r};return function(b){return b.position=new s(y),f(),b}}function s(y){this.start=y,this.end={line:n,column:r},this.source=t.source}s.prototype.content=e;function u(y){var b=new Error(t.source+":"+n+":"+r+": "+y);if(b.reason=y,b.filename=t.source,b.line=n,b.column=r,b.source=e,!t.silent)throw b}function c(y){var b=y.exec(e);if(!!b){var C=b[0];return i(C),e=e.slice(C.length),b}}function f(){c(ate)}function p(y){var b;for(y=y||[];b=h();)b!==!1&&y.push(b);return y}function h(){var y=o();if(!(KE!=e.charAt(0)||XE!=e.charAt(1))){for(var b=2;Ta!=e.charAt(b)&&(XE!=e.charAt(b)||KE!=e.charAt(b+1));)++b;if(b+=2,Ta===e.charAt(b-1))return u("End of comment missing");var C=e.slice(2,b-2);return r+=2,i(C),e=e.slice(b),r+=2,y({type:pte,comment:C})}}function g(){var y=o(),b=c(ste);if(!!b){if(h(),!c(lte))return u("property missing ':'");var C=c(ute),x=y({type:hte,property:QE(b[0].replace(YE,Ta)),value:C?QE(C[0].replace(YE,Ta)):Ta});return c(cte),x}}function v(){var y=[];p(y);for(var b;b=g();)b!==!1&&(y.push(b),p(y));return y}return f(),v()};function QE(e){return e?e.replace(fte,Ta):Ta}var gte=mte;function vte(e,t){var n=null;if(!e||typeof e!="string")return n;for(var r,i=gte(e),o=typeof t=="function",s,u,c=0,f=i.length;c0?Ye.createElement(g,u,p):Ye.createElement(g,u)}function wte(e){let t=-1;for(;++t for more info)`),delete zd[o]}const t=QQ().use(eee).use(e.remarkPlugins||[]).use(jee,{...e.remarkRehypeOptions,allowDangerousHtml:!0}).use(e.rehypePlugins||[]).use(tte,e),n=new hA;typeof e.children=="string"?n.value=e.children:e.children!==void 0&&e.children!==null&&console.warn(`[react-markdown] Warning: please pass a string as \`children\` (not: \`${e.children}\`)`);const r=t.runSync(t.parse(n),n);if(r.type!=="root")throw new TypeError("Expected a `root` node");let i=Ye.createElement(Ye.Fragment,{},qA({options:e,schema:Jee,listDepth:0},r));return e.className&&(i=Ye.createElement("div",{className:e.className},i)),i}Pb.defaultProps={transformLinkUri:FQ};Pb.propTypes={children:se.exports.string,className:se.exports.string,allowElement:se.exports.func,allowedElements:se.exports.arrayOf(se.exports.string),disallowedElements:se.exports.arrayOf(se.exports.string),unwrapDisallowed:se.exports.bool,remarkPlugins:se.exports.arrayOf(se.exports.oneOfType([se.exports.object,se.exports.func,se.exports.arrayOf(se.exports.oneOfType([se.exports.bool,se.exports.string,se.exports.object,se.exports.func,se.exports.arrayOf(se.exports.any)]))])),rehypePlugins:se.exports.arrayOf(se.exports.oneOfType([se.exports.object,se.exports.func,se.exports.arrayOf(se.exports.oneOfType([se.exports.bool,se.exports.string,se.exports.object,se.exports.func,se.exports.arrayOf(se.exports.any)]))])),sourcePos:se.exports.bool,rawSourcePos:se.exports.bool,skipHtml:se.exports.bool,includeElementIndex:se.exports.bool,transformLinkUri:se.exports.oneOfType([se.exports.func,se.exports.bool]),linkTarget:se.exports.oneOfType([se.exports.func,se.exports.string]),transformImageUri:se.exports.func,components:se.exports.object};const _te=()=>ge("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"1.5",stroke:"#ffffff",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[N("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),N("circle",{cx:"12",cy:"12",r:"9"}),N("polyline",{points:"12 7 12 12 15 15"})]}),Pte=({item:e,inventory:t})=>{const n=Ja(u=>u.inventory.additionalMetadata),r=T.exports.useMemo(()=>xt[e.name],[e]),i=T.exports.useMemo(()=>e.ingredients?Object.entries(e.ingredients).sort((u,c)=>u[1]-c[1]):null,[e]),o=e.metadata?.description||r?.description,s=r?.ammoName&&xt[r?.ammoName]?.label;return N(Vr,{children:r?ge("div",{className:"tooltip-wrapper",children:[ge("div",{className:"tooltip-header-wrapper",children:[N("p",{children:e.metadata?.label||r.label||e.name}),t.type==="crafting"?ge("div",{className:"tooltip-crafting-duration",children:[N(_te,{}),ge("p",{children:[(e.duration!==void 0?e.duration:3e3)/1e3,"s"]})]}):N("p",{children:e.metadata?.type})]}),N(nc,{}),o&&N("div",{className:"tooltip-description",children:N(Pb,{className:"tooltip-markdown",children:o})}),t.type!=="crafting"?ge(Vr,{children:[e.durability!==void 0&&ge("p",{children:[Pt.ui_durability,": ",Math.trunc(e.durability)]}),e.metadata?.ammo!==void 0&&ge("p",{children:[Pt.ui_ammo,": ",e.metadata.ammo]}),s&&ge("p",{children:[Pt.ammo_type,": ",s]}),e.metadata?.serial&&ge("p",{children:[Pt.ui_serial,": ",e.metadata.serial]}),e.metadata?.components&&e.metadata?.components[0]&&ge("p",{children:[Pt.ui_components,":"," ",(e.metadata?.components).map((u,c,f)=>c+1===f.length?xt[u]?.label:xt[u]?.label+", ")]}),e.metadata?.weapontint&&ge("p",{children:[Pt.ui_tint,": ",e.metadata.weapontint]}),Object.keys(n).map((u,c)=>N(T.exports.Fragment,{children:e.metadata&&e.metadata[u]&&ge("p",{children:[n[u],": ",e.metadata[u]]})},`metadata-${c}`))]}):N("div",{className:"tooltip-ingredients",children:i&&i.map(u=>{const[c,f]=[u[0],u[1]];return ge("div",{className:"tooltip-ingredient",children:[N("img",{src:c?Js(c):"none",alt:"item-image"}),N("p",{children:f>=1?`${f}x ${xt[c]?.label||c}`:f===0?`${xt[c]?.label||c}`:f<1&&`${f*100}% ${xt[c]?.label||c}`})]},`ingredient-${c}`)})})]}):ge("div",{className:"tooltip-wrapper",children:[N("div",{className:"tooltip-header-wrapper",children:N("p",{children:e.name})}),N(nc,{})]})})},Tte=ax("inventory/craftItem",async(e,{rejectWithValue:t})=>{try{const n=await Wr("craftItem",e);if(n===!1)return t(n)}catch{return t(!1)}}),Ite=(e,t)=>{const{inventory:n}=hr.getState(),r=n.rightInventory,i=n.leftInventory,o=r.items[e.item.slot-1];if(!Fn(o))throw new Error(`Item ${o.slot} name === undefined`);if(o.count===0)return;if(xt[o.name]===void 0)return console.error(`Item ${o.name} data undefined!`);const u=i.items[t.item.slot-1];if(u===void 0)return console.error("Target slot undefined");const c=n.itemAmount===0?1:n.itemAmount,f={fromSlot:o,toSlot:u,fromType:r.type,toType:i.type,count:c};hr.dispatch(Tte({...f,fromSlot:o.slot,toSlot:u.slot}))},Rte=({inventory:e,item:t})=>{const n=lo(),r=Ja(L7),i=_l(),o=Ye.useCallback(()=>!r&&N2(t,e)&&L2(t,e.type),[t,e,r]),[{isDragging:s},u]=h9(()=>({type:"SLOT",collect:v=>({isDragging:v.isDragging()}),item:()=>Fn(t,e.type!==Rn.SHOP)?{inventory:e.type,item:{name:t.name,slot:t.slot},image:t?.name&&`url(${Js(t)||"none"}`}:null,canDrag:o}),[r,e,t]),[{isOver:c},f]=X0(()=>({accept:"SLOT",collect:v=>({isOver:v.isOver()}),drop:v=>v.inventory===Rn.SHOP?LQ(v,{inventory:e.type,item:{slot:t.slot}}):v.inventory===Rn.CRAFTING?Ite(v,{inventory:e.type,item:{slot:t.slot}}):Dy(v,{inventory:e.type,item:{slot:t.slot}}),canDrop:v=>!r&&(v.item.slot!==t.slot||v.inventory!==e.type)&&e.type!==Rn.SHOP&&e.type!==Rn.CRAFTING}),[r,e,t]);Ci("refreshSlots",v=>{!s&&!v.items||!Array.isArray(v.items)||!v.items.find(b=>b.item.slot===t.slot&&b.inventory===e.id)||n.dispatch({type:"dnd-core/END_DRAG"})});const p=v=>u(f(v)),h=v=>{v.preventDefault(),!r&&e.type==="player"&&Fn(t)&&i(Gp({coords:{mouseX:v.clientX,mouseY:v.clientY},item:t}))},g=v=>{r||(v.ctrlKey&&Fn(t)&&e.type!=="shop"&&e.type!=="crafting"?Dy({item:t,inventory:e.type}):v.altKey&&Fn(t)&&e.type==="player"&&lb(t))};return N(AK,{title:!Fn(t)||c||s?"":N(Pte,{item:t,inventory:e}),disableInteractive:!0,followCursor:!0,disableFocusListener:!0,disableTouchListener:!0,placement:"right-start",enterDelay:500,enterNextDelay:500,PopperProps:{disablePortal:!0},children:N("div",{ref:p,onContextMenu:h,onClick:g,className:"inventory-slot",style:{filter:!N2(t,e)||!L2(t,e.type)?"brightness(80%) grayscale(100%)":void 0,opacity:s?.4:1,backgroundImage:`url(${t?.name?Js(t):"none"}`,border:c?"1px dashed rgba(255,255,255,0.4)":""},children:Fn(t)&&ge("div",{className:"item-slot-wrapper",children:[ge("div",{className:e.type==="player"&&t.slot<=5?"item-hotslot-header-wrapper":"item-slot-header-wrapper",children:[e.type==="player"&&t.slot<=5&&N("div",{className:"inventory-slot-number",children:t.slot}),ge("div",{className:"item-slot-info-wrapper",children:[N("p",{children:t.weight>0?t.weight>=1e3?`${(t.weight/1e3).toLocaleString("en-us",{minimumFractionDigits:2})}kg `:`${t.weight.toLocaleString("en-us",{minimumFractionDigits:0})}g `:""}),N("p",{children:t.count?t.count.toLocaleString("en-us")+"x":""})]})]}),ge("div",{children:[e.type!=="shop"&&t?.durability!==void 0&&N(Sb,{percent:t.durability,durability:!0}),e.type==="shop"&&t?.price!==void 0&&N(Vr,{children:t?.currency!=="money"&&t.currency!=="black_money"&&t.price>0&&t.currency?ge("div",{className:"item-slot-currency-wrapper",children:[N("img",{src:t.currency?Js(t.currency):"none",alt:"item-image",style:{imageRendering:"-webkit-optimize-contrast",height:"auto",width:"2vh",backfaceVisibility:"hidden",transform:"translateZ(0)"}}),N("p",{children:t.price.toLocaleString("en-us")})]}):N(Vr,{children:t.price>0&&N("div",{className:"item-slot-price-wrapper",style:{color:t.currency==="money"||!t.currency?"#2ECC71":"#E74C3C"},children:ge("p",{children:[Pt.$||"$",t.price.toLocaleString("en-us")]})})})}),N("div",{className:"inventory-slot-label-box",children:N("div",{className:"inventory-slot-label-text",children:t.metadata?.label?t.metadata.label:xt[t.name]?.label||t.name})})]})]})})})},Ate=e=>{const t=document.createElement("input");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)};var za={},ua={exports:{}};(function(e){function t(n){return n&&n.__esModule?n:{default:n}}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports})(ua);const Tb=ih(MU);var wu={},_s={};const of=ih(oz);var Zv={exports:{}},JE;function bm(){return JE||(JE=1,function(e){function t(n,r){if(n==null)return{};var i={},o=Object.keys(n),s,u;for(u=0;u=0)&&(i[s]=n[s]);return i}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(Zv)),Zv.exports}const Ib=ih(_j),Mte=ih($U);var Bd={},eO;function $te(){if(eO)return Bd;eO=1;var e=ua.exports;Object.defineProperty(Bd,"__esModule",{value:!0}),Bd.default=n;var t=e(of);function n(r,i){return(0,t.default)({toolbar:{minHeight:56,[r.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[r.up("sm")]:{minHeight:64}}},i)}return Bd}var Eo={},Su={},tO;function Dte(){if(tO)return Su;tO=1,Object.defineProperty(Su,"__esModule",{value:!0}),Su.default=void 0;var t={black:"#000",white:"#fff"};return Su.default=t,Su}var ku={},nO;function Nte(){if(nO)return ku;nO=1,Object.defineProperty(ku,"__esModule",{value:!0}),ku.default=void 0;var t={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"};return ku.default=t,ku}var Cu={},rO;function Lte(){if(rO)return Cu;rO=1,Object.defineProperty(Cu,"__esModule",{value:!0}),Cu.default=void 0;var t={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"};return Cu.default=t,Cu}var Eu={},iO;function Fte(){if(iO)return Eu;iO=1,Object.defineProperty(Eu,"__esModule",{value:!0}),Eu.default=void 0;var t={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"};return Eu.default=t,Eu}var Ou={},oO;function zte(){if(oO)return Ou;oO=1,Object.defineProperty(Ou,"__esModule",{value:!0}),Ou.default=void 0;var t={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"};return Ou.default=t,Ou}var _u={},aO;function Bte(){if(aO)return _u;aO=1,Object.defineProperty(_u,"__esModule",{value:!0}),_u.default=void 0;var t={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"};return _u.default=t,_u}var Pu={},sO;function jte(){if(sO)return Pu;sO=1,Object.defineProperty(Pu,"__esModule",{value:!0}),Pu.default=void 0;var t={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"};return Pu.default=t,Pu}var Tu={},lO;function Wte(){if(lO)return Tu;lO=1,Object.defineProperty(Tu,"__esModule",{value:!0}),Tu.default=void 0;var t={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"};return Tu.default=t,Tu}var uO;function Ute(){if(uO)return Eo;uO=1;var e=ua.exports;Object.defineProperty(Eo,"__esModule",{value:!0}),Eo.dark=void 0,Eo.default=R,Eo.light=void 0;var t=e(of),n=e(bm()),r=Ib,i=Tb,o=e(Dte()),s=e(Nte()),u=e(Lte()),c=e(Fte()),f=e(zte()),p=e(Bte()),h=e(jte()),g=e(Wte());const v=["mode","contrastThreshold","tonalOffset"],y={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:o.default.white,default:o.default.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}};Eo.light=y;const b={text:{primary:o.default.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:o.default.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};Eo.dark=b;function C(D,W,L,B){const Y=B.light||B,Z=B.dark||B*1.5;D[W]||(D.hasOwnProperty(L)?D[W]=D[L]:W==="light"?D.light=(0,i.lighten)(D.main,Y):W==="dark"&&(D.dark=(0,i.darken)(D.main,Z)))}function x(D="light"){return D==="dark"?{main:p.default[200],light:p.default[50],dark:p.default[400]}:{main:p.default[700],light:p.default[400],dark:p.default[800]}}function w(D="light"){return D==="dark"?{main:u.default[200],light:u.default[50],dark:u.default[400]}:{main:u.default[500],light:u.default[300],dark:u.default[700]}}function S(D="light"){return D==="dark"?{main:c.default[500],light:c.default[300],dark:c.default[700]}:{main:c.default[700],light:c.default[400],dark:c.default[800]}}function E(D="light"){return D==="dark"?{main:h.default[400],light:h.default[300],dark:h.default[700]}:{main:h.default[700],light:h.default[500],dark:h.default[900]}}function I(D="light"){return D==="dark"?{main:g.default[400],light:g.default[300],dark:g.default[700]}:{main:g.default[800],light:g.default[500],dark:g.default[900]}}function _(D="light"){return D==="dark"?{main:f.default[400],light:f.default[300],dark:f.default[700]}:{main:"#ed6c02",light:f.default[500],dark:f.default[900]}}function R(D){const{mode:W="light",contrastThreshold:L=3,tonalOffset:B=.2}=D,Y=(0,n.default)(D,v),Z=D.primary||x(W),re=D.secondary||w(W),te=D.error||S(W),oe=D.info||E(W),le=D.success||I(W),H=D.warning||_(W);function Q(we){return(0,i.getContrastRatio)(we,b.text.primary)>=L?b.text.primary:y.text.primary}const K=({color:we,name:xe,mainShade:Se=500,lightShade:me=300,darkShade:Ae=700})=>{if(we=(0,t.default)({},we),!we.main&&we[Se]&&(we.main=we[Se]),!we.hasOwnProperty("main"))throw new Error((0,r.formatMuiErrorMessage)(11,xe?` (${xe})`:"",Se));if(typeof we.main!="string")throw new Error((0,r.formatMuiErrorMessage)(12,xe?` (${xe})`:"",JSON.stringify(we.main)));return C(we,"light",me,B),C(we,"dark",Ae,B),we.contrastText||(we.contrastText=Q(we.main)),we},A={dark:b,light:y};return(0,r.deepmerge)((0,t.default)({common:(0,t.default)({},o.default),mode:W,primary:K({color:Z,name:"primary"}),secondary:K({color:re,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:K({color:te,name:"error"}),warning:K({color:H,name:"warning"}),info:K({color:oe,name:"info"}),success:K({color:le,name:"success"}),grey:s.default,contrastThreshold:L,getContrastText:Q,augmentColor:K,tonalOffset:B},A[W]),Y)}return Eo}var jd={},cO;function Hte(){if(cO)return jd;cO=1;var e=ua.exports;Object.defineProperty(jd,"__esModule",{value:!0}),jd.default=c;var t=e(of),n=e(bm()),r=Ib;const i=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"];function o(f){return Math.round(f*1e5)/1e5}const s={textTransform:"uppercase"},u='"Roboto", "Helvetica", "Arial", sans-serif';function c(f,p){const h=typeof p=="function"?p(f):p,{fontFamily:g=u,fontSize:v=14,fontWeightLight:y=300,fontWeightRegular:b=400,fontWeightMedium:C=500,fontWeightBold:x=700,htmlFontSize:w=16,allVariants:S,pxToRem:E}=h,I=(0,n.default)(h,i),_=v/14,R=E||(L=>`${L/w*_}rem`),D=(L,B,Y,Z,re)=>(0,t.default)({fontFamily:g,fontWeight:L,fontSize:R(B),lineHeight:Y},g===u?{letterSpacing:`${o(Z/B)}em`}:{},re,S),W={h1:D(y,96,1.167,-1.5),h2:D(y,60,1.2,-.5),h3:D(b,48,1.167,0),h4:D(b,34,1.235,.25),h5:D(b,24,1.334,0),h6:D(C,20,1.6,.15),subtitle1:D(b,16,1.75,.15),subtitle2:D(C,14,1.57,.1),body1:D(b,16,1.5,.15),body2:D(b,14,1.43,.15),button:D(C,14,1.75,.4,s),caption:D(b,12,1.66,.4),overline:D(b,12,2.66,1,s)};return(0,r.deepmerge)((0,t.default)({htmlFontSize:w,pxToRem:R,fontFamily:g,fontSize:v,fontWeightLight:y,fontWeightRegular:b,fontWeightMedium:C,fontWeightBold:x},W),I,{clone:!1})}return jd}var Iu={},fO;function Vte(){if(fO)return Iu;fO=1,Object.defineProperty(Iu,"__esModule",{value:!0}),Iu.default=void 0;const e=.2,t=.14,n=.12;function r(...s){return[`${s[0]}px ${s[1]}px ${s[2]}px ${s[3]}px rgba(0,0,0,${e})`,`${s[4]}px ${s[5]}px ${s[6]}px ${s[7]}px rgba(0,0,0,${t})`,`${s[8]}px ${s[9]}px ${s[10]}px ${s[11]}px rgba(0,0,0,${n})`].join(",")}var o=["none",r(0,2,1,-1,0,1,1,0,0,1,3,0),r(0,3,1,-2,0,2,2,0,0,1,5,0),r(0,3,3,-2,0,3,4,0,0,1,8,0),r(0,2,4,-1,0,4,5,0,0,1,10,0),r(0,3,5,-1,0,5,8,0,0,1,14,0),r(0,3,5,-1,0,6,10,0,0,1,18,0),r(0,4,5,-2,0,7,10,1,0,2,16,1),r(0,5,5,-3,0,8,10,1,0,3,14,2),r(0,5,6,-3,0,9,12,1,0,3,16,2),r(0,6,6,-3,0,10,14,1,0,4,18,3),r(0,6,7,-4,0,11,15,1,0,4,20,3),r(0,7,8,-4,0,12,17,2,0,5,22,4),r(0,7,8,-4,0,13,19,2,0,5,24,4),r(0,7,9,-4,0,14,21,2,0,5,26,4),r(0,8,9,-5,0,15,22,2,0,6,28,5),r(0,8,10,-5,0,16,24,2,0,6,30,5),r(0,8,11,-5,0,17,26,2,0,6,32,5),r(0,9,11,-5,0,18,28,2,0,7,34,6),r(0,9,12,-6,0,19,29,2,0,7,36,6),r(0,10,13,-6,0,20,31,3,0,8,38,7),r(0,10,13,-6,0,21,33,3,0,8,40,7),r(0,10,14,-6,0,22,35,3,0,8,42,7),r(0,11,14,-7,0,23,36,3,0,9,44,8),r(0,11,15,-7,0,24,38,3,0,9,46,8)];return Iu.default=o,Iu}var Oo={},dO;function Gte(){if(dO)return Oo;dO=1;var e=ua.exports;Object.defineProperty(Oo,"__esModule",{value:!0}),Oo.default=c,Oo.easing=Oo.duration=void 0;var t=e(bm()),n=e(of);const r=["duration","easing","delay"],i={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"};Oo.easing=i;const o={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};Oo.duration=o;function s(f){return`${Math.round(f)}ms`}function u(f){if(!f)return 0;const p=f/36;return Math.round((4+15*p**.25+p/5)*10)}function c(f){const p=(0,n.default)({},i,f.easing),h=(0,n.default)({},o,f.duration),g=(v=["all"],y={})=>{const{duration:b=h.standard,easing:C=p.easeInOut,delay:x=0}=y;return(0,t.default)(y,r),(Array.isArray(v)?v:[v]).map(w=>`${w} ${typeof b=="string"?b:s(b)} ${C} ${typeof x=="string"?x:s(x)}`).join(",")};return(0,n.default)({getAutoHeightDuration:u,create:g},f,{easing:p,duration:h})}return Oo}var Ru={},pO;function qte(){if(pO)return Ru;pO=1,Object.defineProperty(Ru,"__esModule",{value:!0}),Ru.default=void 0;var t={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};return Ru.default=t,Ru}var hO;function Yte(){if(hO)return _s;hO=1;var e=ua.exports;Object.defineProperty(_s,"__esModule",{value:!0}),_s.createMuiTheme=v,_s.default=void 0;var t=e(of),n=e(bm()),r=Ib,i=Tb;e(Mte);var o=e($te()),s=e(Ute()),u=e(Hte()),c=e(Vte()),f=e(Gte()),p=e(qte());const h=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];function g(b={},...C){const{mixins:x={},palette:w={},transitions:S={},typography:E={}}=b,I=(0,n.default)(b,h);if(b.vars)throw new Error((0,r.formatMuiErrorMessage)(18));const _=(0,s.default)(w),R=(0,i.createTheme)(b);let D=(0,r.deepmerge)(R,{mixins:(0,o.default)(R.breakpoints,x),palette:_,shadows:c.default.slice(),typography:(0,u.default)(_,E),transitions:(0,f.default)(S),zIndex:(0,t.default)({},p.default)});return D=(0,r.deepmerge)(D,I),D=C.reduce((W,L)=>(0,r.deepmerge)(W,L),D),D}function v(...b){return g(...b)}var y=g;return _s.default=y,_s}var mO;function Kte(){if(mO)return wu;mO=1;var e=ua.exports;Object.defineProperty(wu,"__esModule",{value:!0}),wu.default=void 0;var t=e(Yte()),r=(0,t.default)();return wu.default=r,wu}var Xte=ua.exports;Object.defineProperty(za,"__esModule",{value:!0});za.slotShouldForwardProp=za.rootShouldForwardProp=wm=za.default=void 0;var Rb=Tb,Qte=Xte(Kte());const YA=e=>(0,Rb.shouldForwardProp)(e)&&e!=="classes";za.rootShouldForwardProp=YA;const Zte=Rb.shouldForwardProp;za.slotShouldForwardProp=Zte;const Jte=(0,Rb.createStyled)({defaultTheme:Qte.default,rootShouldForwardProp:YA});var ene=Jte,wm=za.default=ene;function af(e,t){return Object.keys(t).forEach(function(n){n==="default"||n==="__esModule"||e.hasOwnProperty(n)||Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[n]}})}),e}function sf(e,t,n,r){Object.defineProperty(e,t,{get:n,set:r,enumerable:!0,configurable:!0})}var lf={},KA={};sf(KA,"ContextMenu",()=>JA);var XA={};sf(XA,"nestedMenuItemsFromObject",()=>km);var QA={};sf(QA,"NestedMenuItem",()=>Fc);var ZA={};sf(ZA,"IconMenuItem",()=>Sm);const tne=wm(Vi)({paddingLeft:"4px",paddingRight:"4px",display:"flex",justifyContent:"space-between"}),nne=wm(_R)({paddingLeft:"8px",paddingRight:"8px",textAlign:"left"}),rne=wm(ZI)({display:"flex"}),Sm=T.exports.forwardRef(({leftIcon:e,rightIcon:t,label:n,MenuItemProps:r,className:i,...o},s)=>ge(tne,{...r,ref:s,className:i,...o,children:[ge(rne,{children:[e,N(nne,{children:n})]}),t]}));Sm.displayName="IconMenuItem";const ine=e=>N(Qp,{...e,children:N("path",{d:"M9.29 6.71c-.39.39-.39 1.02 0 1.41L13.17 12l-3.88 3.88c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41L10.7 6.7c-.38-.38-1.02-.38-1.41.01z"})}),Fc=Ye.forwardRef(function(t,n){const{parentMenuOpen:r,label:i,rightIcon:o=N(ine,{}),leftIcon:s=null,children:u,className:c,tabIndex:f,ContainerProps:p={},MenuProps:h,...g}=t,{ref:v,...y}=p,b=T.exports.useRef(null);T.exports.useImperativeHandle(n,()=>b.current);const C=T.exports.useRef(null);T.exports.useImperativeHandle(v,()=>C.current);const x=T.exports.useRef(null),[w,S]=T.exports.useState(!1),E=B=>{S(!0),y.onMouseEnter&&y.onMouseEnter(B)},I=B=>{S(!1),y.onMouseLeave&&y.onMouseLeave(B)},_=()=>{const B=C.current?.ownerDocument.activeElement??null;for(const Y of x.current.children)if(Y===B)return!0;return!1},R=B=>{B.target===C.current&&S(!0),y.onFocus&&y.onFocus(B)},D=B=>{if(B.key==="Escape")return;_()&&B.stopPropagation();const Y=C.current?.ownerDocument.activeElement;B.key==="ArrowLeft"&&_()&&C.current?.focus(),B.key==="ArrowRight"&&B.target===C.current&&B.target===Y&&x.current?.children[0]?.focus()},W=w&&r;let L;return t.disabled||(L=f!==void 0?f:-1),ge("div",{...y,ref:C,onFocus:R,tabIndex:L,onMouseEnter:E,onMouseLeave:I,onKeyDown:D,children:[N(Sm,{MenuItemProps:g,className:c,ref:b,leftIcon:s,rightIcon:o,label:i}),N(pm,{style:{pointerEvents:"none"},anchorEl:b.current,anchorOrigin:{vertical:"top",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"left"},open:W,autoFocus:!1,disableAutoFocus:!0,disableEnforceFocus:!0,onClose:()=>{S(!1)},...h,children:N("div",{ref:x,style:{pointerEvents:"auto"},children:u})})]})});Fc.displayName="NestedMenuItem";function km({menuItemsData:e,isOpen:t,handleClose:n}){return e.map(r=>{const{leftIcon:i,rightIcon:o,label:s,items:u,callback:c}=r;return u&&u.length>0?N(Fc,{leftIcon:i,rightIcon:o,label:s,parentMenuOpen:t,children:km({menuItemsData:u,isOpen:t,handleClose:n})},s):N(Sm,{leftIcon:i,rightIcon:o,label:s,onClick:()=>{n(),c&&c()}},s)})}const JA=T.exports.forwardRef(({children:e,menuItems:t,menuItemsData:n},r)=>{const i=r??T.exports.useRef(null),[o,s]=T.exports.useState(null),[u,c]=T.exports.useState(null),f=()=>s(null),p=v=>{if(o!==null&&s(null),v.button!==2)return;const y=i.current.getBoundingClientRect();v.clientXy.right||v.clientYy.bottom||c({top:v.clientY,left:v.clientX})},h=v=>{const y=v.clientY,b=v.clientX;u!==null&&u.top===y&&u.left===b&&s({top:v.clientY,left:v.clientX})},g=t??(n&&km({menuItemsData:n,isOpen:!!o,handleClose:f}));return ge("div",{ref:i,onContextMenu:v=>v.preventDefault(),onMouseDown:p,onMouseUp:h,children:[o&&N(pm,{onContextMenu:v=>v.preventDefault(),open:!!o,onClose:()=>s(null),anchorReference:"anchorPosition",anchorPosition:o,children:g}),e]})});JA.displayName="ContextMenu";var eM={};sf(eM,"NestedDropdown",()=>ane);const one=e=>N(Qp,{...e,children:N("path",{d:"M8.12 9.29 12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7a.9959.9959 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z"})}),ane=Ye.forwardRef(function(t,n){const[r,i]=Ye.useState(null),o=Boolean(r),{menuItemsData:s,onClick:u,ButtonProps:c,MenuProps:f,...p}=t,h=y=>{i(y.currentTarget),u&&u(y)},g=()=>i(null),v=km({menuItemsData:s?.items??[],isOpen:o,handleClose:g});return ge("div",{ref:n,...p,children:[N(Tq,{onClick:h,endIcon:N(one,{}),...c,children:s?.label??"Menu"}),N(pm,{anchorEl:r,open:o,onClose:g,...f,children:v})]})});af(lf,KA);af(lf,eM);af(lf,ZA);af(lf,QA);af(lf,XA);const sne=()=>{const e=Ja(o=>o.inventory.contextMenu),t=e.item,n=_l(),r=o=>{if(!!t)switch(n(Gp({coords:null})),o&&o.action){case"use":lb({name:t.name,slot:t.slot});break;case"give":NR({name:t.name,slot:t.slot});break;case"drop":Fn(t)&&Dy({item:t,inventory:"player"});break;case"remove":Wr("removeComponent",{component:o?.component,slot:o?.slot});break;case"removeAmmo":Wr("removeAmmo",t.slot);break;case"copy":Ate(o.serial||"");break;case"custom":Wr("useButton",{id:(o?.id||0)+1,slot:t.slot});break}},i=o=>o.reduce((s,u,c)=>{if(u.group){const f=s.findIndex(p=>p.groupName===u.group);f!==-1?s[f].buttons.push({...u,index:c}):s.push({groupName:u.group,buttons:[{...u,index:c}]})}else s.push({groupName:null,buttons:[{...u,index:c}]});return s},[]);return N(Vr,{children:ge(pm,{autoFocus:!1,disableAutoFocusItem:!0,disableRestoreFocus:!0,disableAutoFocus:!0,disableEnforceFocus:!0,open:e.coords!==null,anchorReference:"anchorPosition",anchorPosition:e.coords!==null?{top:e.coords.mouseY,left:e.coords.mouseX}:void 0,onClose:()=>n(Gp({coords:null})),children:[N(Vi,{onClick:()=>r({action:"use"}),children:Pt.ui_use||"Use"}),N(Vi,{onClick:()=>r({action:"give"}),children:Pt.ui_give||"Give"}),N(Vi,{onClick:()=>r({action:"drop"}),children:Pt.ui_drop||"Drop"}),t&&t.metadata?.serial&&N(nc,{}),t&&t.metadata?.ammo>0&&N(Vi,{onClick:()=>r({action:"removeAmmo"}),children:Pt.ui_remove_ammo}),t&&t.metadata?.serial&&N(Vi,{onClick:()=>r({action:"copy",serial:t.metadata?.serial}),children:Pt.ui_copy}),t&&t.metadata?.components&&t.metadata?.components.length>0&&N(nc,{}),t&&t.metadata?.components&&t.metadata?.components.length>0&&N(Fc,{parentMenuOpen:!!e,label:Pt.ui_removeattachments,children:t&&t.metadata?.components.map((o,s)=>N(Vi,{onClick:()=>r({action:"remove",component:o,slot:t.slot}),children:xt[o]?.label},s))}),(t&&t.name&&xt[t.name]?.buttons?.length||0)>0&&N(nc,{}),(t&&t.name&&xt[t.name]?.buttons?.length||0)>0&&N(Vr,{children:t&&t.name&&i(xt[t.name]?.buttons).map((o,s)=>N("div",{children:o.groupName?N(Fc,{parentMenuOpen:!!e,label:o.groupName,children:o.buttons.map(u=>N(Vi,{onClick:()=>r({action:"custom",id:u.index}),children:u.label},u.index))}):o.buttons.map(u=>N(Vi,{onClick:()=>r({action:"custom",id:u.index}),children:u.label},u.index))},s))})]})})},tM=({inventory:e})=>{const t=Ye.useMemo(()=>e.maxWeight!==void 0?Math.floor(b7(e.items)*1e3)/1e3:0,[e.maxWeight,e.items]);return N(Vr,{children:ge("div",{className:"inventory-grid-wrapper",children:[ge("div",{children:[ge("div",{className:"inventory-grid-header-wrapper",children:[N("p",{children:e.label}),e.maxWeight&&ge("p",{children:[t/1e3,"/",e.maxWeight/1e3,"kg"]})]}),N(Sb,{percent:e.maxWeight?t/e.maxWeight*100:0})]}),N("div",{className:"inventory-grid-container",children:ge(Vr,{children:[e.items.map(n=>N(Rte,{item:n,inventory:e},`${e.type}-${e.id}-${n.slot}`)),e.type==="player"&&Xa.exports.createPortal(N(sne,{}),document.body)]})})]})})},lne=()=>{const e=Ja(D7);return N(tM,{inventory:e})},une=()=>{const e=Ja(dT);return N(tM,{inventory:e})},cne=()=>{const[e,t]=Ye.useState(!1),n=_l();return Ci("setInventoryVisible",t),Ci("closeInventory",()=>{t(!1),n(Gp({coords:null}))}),$Q(t),Ci("setupInventory",r=>{n(fT(r)),!e&&t(!0)}),Ci("refreshSlots",r=>n(M7(r))),Ci("displayMetadata",r=>{n(_7(r))}),ge(Vr,{children:[N(dm,{in:e,children:ge("div",{className:"inventory-wrapper",children:[N(une,{}),N(RQ,{}),N(lne,{})]})}),N(AQ,{})]})},Gy=(e,t)=>({x:e.x-t.x,y:e.y-t.y}),fne=e=>{const t=e.getInitialClientOffset(),n=e.getInitialSourceClientOffset();return t===null||n===null||t.x===void 0||t.y===void 0?{x:0,y:0}:Gy(t,n)},dne=(e,t)=>{const n=e.getClientOffset();if(n===null)return null;if(!t.current||!t.current.getBoundingClientRect)return Gy(n,fne(e));const r=t.current.getBoundingClientRect(),i={x:r.width/2,y:r.height/2};return Gy(n,i)},pne=()=>{const e=T.exports.useRef(null),{data:t,isDragging:n,currentOffset:r}=m9(i=>({data:i.getItem(),currentOffset:dne(i,e),isDragging:i.isDragging()}));return N(Vr,{children:n&&r&&t.item&&N("div",{className:"item-drag-preview",ref:e,style:{transform:`translate(${r.x}px, ${r.y}px)`,backgroundImage:t.image}})})},hne=e=>{const[t,n]=Ye.useState(!1),r=Ye.useCallback(({key:o})=>{o===e&&n(!0)},[e]),i=Ye.useCallback(({key:o})=>{o===e&&n(!1)},[e]);return Ye.useEffect(()=>(window.addEventListener("keydown",r),window.addEventListener("keyup",i),()=>{window.removeEventListener("keydown",r),window.removeEventListener("keyup",i)}),[r,i]),t},mne=()=>{const e=_l(),t=hne("Shift");return T.exports.useEffect(()=>{e(T7(t))},[t,e]),N(Vr,{})},gne=()=>{const e=_l(),t=lo();return Ci("init",({locale:n,items:r,leftInventory:i,imagepath:o})=>{for(const s in n)Pt[s]=n[s];for(const s in r)xt[s]=r[s];g7(o),e(fT({leftInventory:i}))}),Wr("uiLoaded",{}),Ci("closeInventory",()=>{t.dispatch({type:"dnd-core/END_DRAG"})}),ge(yq,{sx:{height:"100%",width:"100%",color:"white"},children:[N(cne,{}),N(pne,{}),N(mne,{})]})};const vne=(e=[])=>{const[t,n]=T.exports.useState(e);return{add:r=>{n(i=>[...i,r])},remove:()=>{let r;return n(([i,...o])=>(r=i,o)),r},get values(){return t},get first(){return t[0]},get last(){return t[t.length-1]},get size(){return t.length}}},yne=Ye.createContext(null),xne=Ye.forwardRef((e,t)=>{const n=e.item.item;return N("div",{className:"item-notification-item-box",style:{backgroundImage:`url(${Js(n)||"none"}`,...e.style},ref:t,children:ge("div",{className:"item-slot-wrapper",children:[N("div",{className:"item-notification-action-box",children:N("p",{children:e.item.text})}),N("div",{className:"inventory-slot-label-box",children:N("div",{className:"inventory-slot-label-text",children:n.metadata?.label||xt[n.name]?.label})})]})})}),bne=({children:e})=>{const t=vne(),n=r=>{const i=Ye.createRef(),o={id:Date.now(),item:r,ref:i};t.add(o);const s=setTimeout(()=>{t.remove(),clearTimeout(s)},2500)};return Ci("itemNotify",([r,i,o])=>{n({item:r,text:o?`${Pt[i]} ${o}x`:`${Pt[i]}`})}),ge(yne.Provider,{value:{add:n},children:[e,Xa.exports.createPortal(N(OR,{className:"item-notification-container",children:t.values.map((r,i)=>N(dm,{children:N(xne,{item:r.item,ref:r.ref})},`item-notification-${i}`))}),document.body)]})},Bu=document.getElementById("root");lT()&&(Bu.style.backgroundImage='url("https://i.imgur.com/3pzRj9n.png")',Bu.style.backgroundSize="cover",Bu.style.backgroundRepeat="no-repeat",Bu.style.backgroundPosition="center");EP(Bu).render(N(Ye.StrictMode,{children:N(bz,{store:hr,children:N(Hx,{theme:qx({palette:{mode:"dark"}}),children:N(G8,{backend:A9,options:{enableMouseEvents:!0},children:N(bne,{children:N(gne,{})})})})})})); diff --git a/server-data/resources/[ox]/ox_inventory/web/build/assets/index-e31759b5.js b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-e31759b5.js new file mode 100644 index 000000000..fb586b660 --- /dev/null +++ b/server-data/resources/[ox]/ox_inventory/web/build/assets/index-e31759b5.js @@ -0,0 +1,40 @@ +function nA(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const s of l.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerpolicy&&(l.referrerPolicy=i.referrerpolicy),i.crossorigin==="use-credentials"?l.credentials="include":i.crossorigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function r(i){if(i.ep)return;i.ep=!0;const l=n(i);fetch(i.href,l)}})();var Eu=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Fg(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ef={exports:{}},tf={},T={exports:{}},Ne={};var ks=Symbol.for("react.element"),rA=Symbol.for("react.portal"),iA=Symbol.for("react.fragment"),oA=Symbol.for("react.strict_mode"),lA=Symbol.for("react.profiler"),uA=Symbol.for("react.provider"),sA=Symbol.for("react.context"),aA=Symbol.for("react.forward_ref"),cA=Symbol.for("react.suspense"),fA=Symbol.for("react.memo"),dA=Symbol.for("react.lazy"),i1=Symbol.iterator;function pA(e){return e===null||typeof e!="object"?null:(e=i1&&e[i1]||e["@@iterator"],typeof e=="function"?e:null)}var Jw={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},eS=Object.assign,tS={};function Jl(e,t,n){this.props=e,this.context=t,this.refs=tS,this.updater=n||Jw}Jl.prototype.isReactComponent={};Jl.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Jl.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function nS(){}nS.prototype=Jl.prototype;function zg(e,t,n){this.props=e,this.context=t,this.refs=tS,this.updater=n||Jw}var $g=zg.prototype=new nS;$g.constructor=zg;eS($g,Jl.prototype);$g.isPureReactComponent=!0;var o1=Array.isArray,rS=Object.prototype.hasOwnProperty,Bg={current:null},iS={key:!0,ref:!0,__self:!0,__source:!0};function oS(e,t,n){var r,i={},l=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(l=""+t.key),t)rS.call(t,r)&&!iS.hasOwnProperty(r)&&(i[r]=t[r]);var a=arguments.length-2;if(a===1)i.children=n;else if(1>>1,O=U[b];if(0>>1;bi(Ae,ee))dei(Oe,Ae)?(U[b]=Oe,U[de]=ee,b=de):(U[b]=Ae,U[ve]=ee,b=ve);else if(dei(Oe,ee))U[b]=Oe,U[de]=ee,b=de;else break e}}return J}function i(U,J){var ee=U.sortIndex-J.sortIndex;return ee!==0?ee:U.id-J.id}if(typeof performance=="object"&&typeof performance.now=="function"){var l=performance;e.unstable_now=function(){return l.now()}}else{var s=Date,a=s.now();e.unstable_now=function(){return s.now()-a}}var f=[],d=[],h=1,g=null,y=3,m=!1,w=!1,E=!1,A=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,S=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function _(U){for(var J=n(d);J!==null;){if(J.callback===null)r(d);else if(J.startTime<=U)r(d),J.sortIndex=J.expirationTime,t(f,J);else break;J=n(d)}}function P(U){if(E=!1,_(U),!w)if(n(f)!==null)w=!0,oe(D);else{var J=n(d);J!==null&&ue(P,J.startTime-U)}}function D(U,J){w=!1,E&&(E=!1,v(z),z=-1),m=!0;var ee=y;try{for(_(J),g=n(f);g!==null&&(!(g.expirationTime>J)||U&&!B());){var b=g.callback;if(typeof b=="function"){g.callback=null,y=g.priorityLevel;var O=b(g.expirationTime<=J);J=e.unstable_now(),typeof O=="function"?g.callback=O:g===n(f)&&r(f),_(J)}else r(f);g=n(f)}if(g!==null)var fe=!0;else{var ve=n(d);ve!==null&&ue(P,ve.startTime-J),fe=!1}return fe}finally{g=null,y=ee,m=!1}}var R=!1,F=null,z=-1,q=5,K=-1;function B(){return!(e.unstable_now()-KU||125b?(U.sortIndex=ee,t(d,U),n(f)===null&&U===n(d)&&(E?(v(z),z=-1):E=!0,ue(P,ee-b))):(U.sortIndex=O,t(f,U),w||m||(w=!0,oe(D))),U},e.unstable_shouldYield=B,e.unstable_wrapCallback=function(U){var J=y;return function(){var ee=y;y=J;try{return U.apply(this,arguments)}finally{y=ee}}}})(aS);(function(e){e.exports=aS})(sS);var cS=T.exports,Bn=sS.exports;function te(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),mh=Object.prototype.hasOwnProperty,kA=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,u1={},s1={};function _A(e){return mh.call(s1,e)?!0:mh.call(u1,e)?!1:kA.test(e)?s1[e]=!0:(u1[e]=!0,!1)}function bA(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function OA(e,t,n,r){if(t===null||typeof t>"u"||bA(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function dn(e,t,n,r,i,l,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=s}var Wt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Wt[e]=new dn(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Wt[t]=new dn(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Wt[e]=new dn(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Wt[e]=new dn(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Wt[e]=new dn(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Wt[e]=new dn(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Wt[e]=new dn(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Wt[e]=new dn(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Wt[e]=new dn(e,5,!1,e.toLowerCase(),null,!1,!1)});var Hg=/[\-:]([a-z])/g;function jg(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Hg,jg);Wt[t]=new dn(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Hg,jg);Wt[t]=new dn(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Hg,jg);Wt[t]=new dn(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Wt[e]=new dn(e,1,!1,e.toLowerCase(),null,!1,!1)});Wt.xlinkHref=new dn("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Wt[e]=new dn(e,1,!1,e.toLowerCase(),null,!0,!0)});function Wg(e,t,n,r){var i=Wt.hasOwnProperty(t)?Wt[t]:null;(i!==null?i.type!==0:r||!(2a||i[s]!==l[a]){var f=` +`+i[s].replace(" at new "," at ");return e.displayName&&f.includes("")&&(f=f.replace("",e.displayName)),f}while(1<=s&&0<=a);break}}}finally{pp=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Du(e):""}function IA(e){switch(e.tag){case 5:return Du(e.type);case 16:return Du("Lazy");case 13:return Du("Suspense");case 19:return Du("SuspenseList");case 0:case 2:case 15:return e=hp(e.type,!1),e;case 11:return e=hp(e.type.render,!1),e;case 1:return e=hp(e.type,!0),e;default:return""}}function wh(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case yl:return"Fragment";case vl:return"Portal";case vh:return"Profiler";case Vg:return"StrictMode";case yh:return"Suspense";case xh:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case pS:return(e.displayName||"Context")+".Consumer";case dS:return(e._context.displayName||"Context")+".Provider";case qg:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Gg:return t=e.displayName||null,t!==null?t:wh(e.type)||"Memo";case Di:t=e._payload,e=e._init;try{return wh(e(t))}catch{}}return null}function TA(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return wh(t);case 8:return t===Vg?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function eo(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function gS(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function RA(e){var t=gS(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,l=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(s){r=""+s,l.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function _a(e){e._valueTracker||(e._valueTracker=RA(e))}function mS(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=gS(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function fc(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Sh(e,t){var n=t.checked;return vt({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function c1(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=eo(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function vS(e,t){t=t.checked,t!=null&&Wg(e,"checked",t,!1)}function Eh(e,t){vS(e,t);var n=eo(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ch(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ch(e,t.type,eo(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function f1(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ch(e,t,n){(t!=="number"||fc(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Lu=Array.isArray;function Rl(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=ba.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function rs(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Bu={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},PA=["Webkit","ms","Moz","O"];Object.keys(Bu).forEach(function(e){PA.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Bu[t]=Bu[e]})});function SS(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Bu.hasOwnProperty(e)&&Bu[e]?(""+t).trim():t+"px"}function ES(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,i=SS(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}var AA=vt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function bh(e,t){if(t){if(AA[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(te(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(te(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(te(61))}if(t.style!=null&&typeof t.style!="object")throw Error(te(62))}}function Oh(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ih=null;function Kg(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Th=null,Pl=null,Al=null;function h1(e){if(e=Os(e)){if(typeof Th!="function")throw Error(te(280));var t=e.stateNode;t&&(t=uf(t),Th(e.stateNode,e.type,t))}}function CS(e){Pl?Al?Al.push(e):Al=[e]:Pl=e}function kS(){if(Pl){var e=Pl,t=Al;if(Al=Pl=null,h1(e),t)for(e=0;e>>=0,e===0?32:31-(jA(e)/WA|0)|0}var Oa=64,Ia=4194304;function Mu(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function gc(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,l=e.pingedLanes,s=n&268435455;if(s!==0){var a=s&~i;a!==0?r=Mu(a):(l&=s,l!==0&&(r=Mu(l)))}else s=n&~i,s!==0?r=Mu(s):l!==0&&(r=Mu(l));if(r===0)return 0;if(t!==0&&t!==r&&(t&i)===0&&(i=r&-r,l=t&-t,i>=l||i===16&&(l&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function _s(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ir(t),e[t]=n}function KA(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Hu),C1=String.fromCharCode(32),k1=!1;function WS(e,t){switch(e){case"keyup":return ED.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function VS(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var xl=!1;function kD(e,t){switch(e){case"compositionend":return VS(t);case"keypress":return t.which!==32?null:(k1=!0,C1);case"textInput":return e=t.data,e===C1&&k1?null:e;default:return null}}function _D(e,t){if(xl)return e==="compositionend"||!nm&&WS(e,t)?(e=HS(),Ya=Jg=$i=null,xl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=I1(n)}}function QS(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?QS(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function YS(){for(var e=window,t=fc();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=fc(e.document)}return t}function rm(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function LD(e){var t=YS(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&QS(n.ownerDocument.documentElement,n)){if(r!==null&&rm(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,l=Math.min(r.start,i);r=r.end===void 0?l:Math.min(r.end,i),!e.extend&&l>r&&(i=r,r=l,l=i),i=T1(n,l);var s=T1(n,r);i&&s&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),l>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,wl=null,Mh=null,Wu=null,Nh=!1;function R1(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nh||wl==null||wl!==fc(r)||(r=wl,"selectionStart"in r&&rm(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Wu&&as(Wu,r)||(Wu=r,r=yc(Mh,"onSelect"),0Cl||(e.current=Hh[Cl],Hh[Cl]=null,Cl--)}function tt(e,t){Cl++,Hh[Cl]=e.current,e.current=t}var to={},tn=uo(to),Cn=uo(!1),Mo=to;function jl(e,t){var n=e.type.contextTypes;if(!n)return to;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},l;for(l in n)i[l]=t[l];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function kn(e){return e=e.childContextTypes,e!=null}function wc(){lt(Cn),lt(tn)}function F1(e,t,n){if(tn.current!==to)throw Error(te(168));tt(tn,t),tt(Cn,n)}function oE(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var i in r)if(!(i in t))throw Error(te(108,TA(e)||"Unknown",i));return vt({},n,r)}function Sc(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||to,Mo=tn.current,tt(tn,e),tt(Cn,Cn.current),!0}function z1(e,t,n){var r=e.stateNode;if(!r)throw Error(te(169));n?(e=oE(e,t,Mo),r.__reactInternalMemoizedMergedChildContext=e,lt(Cn),lt(tn),tt(tn,e)):lt(Cn),tt(Cn,n)}var li=null,sf=!1,Ip=!1;function lE(e){li===null?li=[e]:li.push(e)}function qD(e){sf=!0,lE(e)}function so(){if(!Ip&&li!==null){Ip=!0;var e=0,t=Qe;try{var n=li;for(Qe=1;e>=s,i-=s,ui=1<<32-Ir(t)+i|n<z?(q=F,F=null):q=F.sibling;var K=y(v,F,_[z],P);if(K===null){F===null&&(F=q);break}e&&F&&K.alternate===null&&t(v,F),S=l(K,S,z),R===null?D=K:R.sibling=K,R=K,F=q}if(z===_.length)return n(v,F),ft&&So(v,z),D;if(F===null){for(;z<_.length;z++)F=g(v,_[z],P),F!==null&&(S=l(F,S,z),R===null?D=F:R.sibling=F,R=F);return ft&&So(v,z),D}for(F=r(v,F);z<_.length;z++)q=m(F,v,z,_[z],P),q!==null&&(e&&q.alternate!==null&&F.delete(q.key===null?z:q.key),S=l(q,S,z),R===null?D=q:R.sibling=q,R=q);return e&&F.forEach(function(B){return t(v,B)}),ft&&So(v,z),D}function E(v,S,_,P){var D=Cu(_);if(typeof D!="function")throw Error(te(150));if(_=D.call(_),_==null)throw Error(te(151));for(var R=D=null,F=S,z=S=0,q=null,K=_.next();F!==null&&!K.done;z++,K=_.next()){F.index>z?(q=F,F=null):q=F.sibling;var B=y(v,F,K.value,P);if(B===null){F===null&&(F=q);break}e&&F&&B.alternate===null&&t(v,F),S=l(B,S,z),R===null?D=B:R.sibling=B,R=B,F=q}if(K.done)return n(v,F),ft&&So(v,z),D;if(F===null){for(;!K.done;z++,K=_.next())K=g(v,K.value,P),K!==null&&(S=l(K,S,z),R===null?D=K:R.sibling=K,R=K);return ft&&So(v,z),D}for(F=r(v,F);!K.done;z++,K=_.next())K=m(F,v,z,K.value,P),K!==null&&(e&&K.alternate!==null&&F.delete(K.key===null?z:K.key),S=l(K,S,z),R===null?D=K:R.sibling=K,R=K);return e&&F.forEach(function(X){return t(v,X)}),ft&&So(v,z),D}function A(v,S,_,P){if(typeof _=="object"&&_!==null&&_.type===yl&&_.key===null&&(_=_.props.children),typeof _=="object"&&_!==null){switch(_.$$typeof){case ka:e:{for(var D=_.key,R=S;R!==null;){if(R.key===D){if(D=_.type,D===yl){if(R.tag===7){n(v,R.sibling),S=i(R,_.props.children),S.return=v,v=S;break e}}else if(R.elementType===D||typeof D=="object"&&D!==null&&D.$$typeof===Di&&V1(D)===R.type){n(v,R.sibling),S=i(R,_.props),S.ref=Iu(v,R,_),S.return=v,v=S;break e}n(v,R);break}else t(v,R);R=R.sibling}_.type===yl?(S=Ao(_.props.children,v.mode,P,_.key),S.return=v,v=S):(P=ic(_.type,_.key,_.props,null,v.mode,P),P.ref=Iu(v,S,_),P.return=v,v=P)}return s(v);case vl:e:{for(R=_.key;S!==null;){if(S.key===R)if(S.tag===4&&S.stateNode.containerInfo===_.containerInfo&&S.stateNode.implementation===_.implementation){n(v,S.sibling),S=i(S,_.children||[]),S.return=v,v=S;break e}else{n(v,S);break}else t(v,S);S=S.sibling}S=Np(_,v.mode,P),S.return=v,v=S}return s(v);case Di:return R=_._init,A(v,S,R(_._payload),P)}if(Lu(_))return w(v,S,_,P);if(Cu(_))return E(v,S,_,P);Ma(v,_)}return typeof _=="string"&&_!==""||typeof _=="number"?(_=""+_,S!==null&&S.tag===6?(n(v,S.sibling),S=i(S,_),S.return=v,v=S):(n(v,S),S=Mp(_,v.mode,P),S.return=v,v=S),s(v)):n(v,S)}return A}var Vl=hE(!0),gE=hE(!1),Is={},jr=uo(Is),ps=uo(Is),hs=uo(Is);function To(e){if(e===Is)throw Error(te(174));return e}function dm(e,t){switch(tt(hs,t),tt(ps,e),tt(jr,Is),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:_h(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=_h(t,e)}lt(jr),tt(jr,t)}function ql(){lt(jr),lt(ps),lt(hs)}function mE(e){To(hs.current);var t=To(jr.current),n=_h(t,e.type);t!==n&&(tt(ps,e),tt(jr,n))}function pm(e){ps.current===e&&(lt(jr),lt(ps))}var ht=uo(0);function Oc(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Tp=[];function hm(){for(var e=0;en?n:4,e(!0);var r=Rp.transition;Rp.transition={};try{e(!1),t()}finally{Qe=n,Rp.transition=r}}function AE(){return pr().memoizedState}function YD(e,t,n){var r=Gi(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},DE(e))LE(t,n);else if(n=cE(e,t,n,r),n!==null){var i=cn();Tr(n,e,r,i),ME(n,t,r)}}function XD(e,t,n){var r=Gi(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(DE(e))LE(t,i);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var s=t.lastRenderedState,a=l(s,n);if(i.hasEagerState=!0,i.eagerState=a,Rr(a,s)){var f=t.interleaved;f===null?(i.next=i,cm(t)):(i.next=f.next,f.next=i),t.interleaved=i;return}}catch{}finally{}n=cE(e,t,i,r),n!==null&&(i=cn(),Tr(n,e,r,i),ME(n,t,r))}}function DE(e){var t=e.alternate;return e===mt||t!==null&&t===mt}function LE(e,t){Vu=Ic=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function ME(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Yg(e,n)}}var Tc={readContext:dr,useCallback:Qt,useContext:Qt,useEffect:Qt,useImperativeHandle:Qt,useInsertionEffect:Qt,useLayoutEffect:Qt,useMemo:Qt,useReducer:Qt,useRef:Qt,useState:Qt,useDebugValue:Qt,useDeferredValue:Qt,useTransition:Qt,useMutableSource:Qt,useSyncExternalStore:Qt,useId:Qt,unstable_isNewReconciler:!1},ZD={readContext:dr,useCallback:function(e,t){return Fr().memoizedState=[e,t===void 0?null:t],e},useContext:dr,useEffect:G1,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ec(4194308,4,OE.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ec(4194308,4,e,t)},useInsertionEffect:function(e,t){return ec(4,2,e,t)},useMemo:function(e,t){var n=Fr();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Fr();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=YD.bind(null,mt,e),[r.memoizedState,e]},useRef:function(e){var t=Fr();return e={current:e},t.memoizedState=e},useState:q1,useDebugValue:xm,useDeferredValue:function(e){return Fr().memoizedState=e},useTransition:function(){var e=q1(!1),t=e[0];return e=QD.bind(null,e[1]),Fr().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=mt,i=Fr();if(ft){if(n===void 0)throw Error(te(407));n=n()}else{if(n=t(),Nt===null)throw Error(te(349));(Fo&30)!==0||xE(r,t,n)}i.memoizedState=n;var l={value:n,getSnapshot:t};return i.queue=l,G1(SE.bind(null,r,l,e),[e]),r.flags|=2048,vs(9,wE.bind(null,r,l,n,t),void 0,null),n},useId:function(){var e=Fr(),t=Nt.identifierPrefix;if(ft){var n=si,r=ui;n=(r&~(1<<32-Ir(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=gs++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[$r]=t,e[ds]=r,WE(e,t,!1,!1),t.stateNode=e;e:{switch(s=Oh(n,r),n){case"dialog":rt("cancel",e),rt("close",e),i=r;break;case"iframe":case"object":case"embed":rt("load",e),i=r;break;case"video":case"audio":for(i=0;iKl&&(t.flags|=128,r=!0,Tu(l,!1),t.lanes=4194304)}else{if(!r)if(e=Oc(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Tu(l,!0),l.tail===null&&l.tailMode==="hidden"&&!s.alternate&&!ft)return Yt(t),null}else 2*kt()-l.renderingStartTime>Kl&&n!==1073741824&&(t.flags|=128,r=!0,Tu(l,!1),t.lanes=4194304);l.isBackwards?(s.sibling=t.child,t.child=s):(n=l.last,n!==null?n.sibling=s:t.child=s,l.last=s)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=kt(),t.sibling=null,n=ht.current,tt(ht,r?n&1|2:n&1),t):(Yt(t),null);case 22:case 23:return _m(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(Ln&1073741824)!==0&&(Yt(t),t.subtreeFlags&6&&(t.flags|=8192)):Yt(t),null;case 24:return null;case 25:return null}throw Error(te(156,t.tag))}function lL(e,t){switch(om(t),t.tag){case 1:return kn(t.type)&&wc(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ql(),lt(Cn),lt(tn),hm(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return pm(t),null;case 13:if(lt(ht),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(te(340));Wl()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return lt(ht),null;case 4:return ql(),null;case 10:return am(t.type._context),null;case 22:case 23:return _m(),null;case 24:return null;default:return null}}var Fa=!1,Jt=!1,uL=typeof WeakSet=="function"?WeakSet:Set,ae=null;function Ol(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){wt(e,t,r)}else n.current=null}function eg(e,t,n){try{n()}catch(r){wt(e,t,r)}}var nx=!1;function sL(e,t){if(Fh=mc,e=YS(),rm(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,l=r.focusNode;r=r.focusOffset;try{n.nodeType,l.nodeType}catch{n=null;break e}var s=0,a=-1,f=-1,d=0,h=0,g=e,y=null;t:for(;;){for(var m;g!==n||i!==0&&g.nodeType!==3||(a=s+i),g!==l||r!==0&&g.nodeType!==3||(f=s+r),g.nodeType===3&&(s+=g.nodeValue.length),(m=g.firstChild)!==null;)y=g,g=m;for(;;){if(g===e)break t;if(y===n&&++d===i&&(a=s),y===l&&++h===r&&(f=s),(m=g.nextSibling)!==null)break;g=y,y=g.parentNode}g=m}n=a===-1||f===-1?null:{start:a,end:f}}else n=null}n=n||{start:0,end:0}}else n=null;for(zh={focusedElem:e,selectionRange:n},mc=!1,ae=t;ae!==null;)if(t=ae,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,ae=e;else for(;ae!==null;){t=ae;try{var w=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var E=w.memoizedProps,A=w.memoizedState,v=t.stateNode,S=v.getSnapshotBeforeUpdate(t.elementType===t.type?E:kr(t.type,E),A);v.__reactInternalSnapshotBeforeUpdate=S}break;case 3:var _=t.stateNode.containerInfo;_.nodeType===1?_.textContent="":_.nodeType===9&&_.documentElement&&_.removeChild(_.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(te(163))}}catch(P){wt(t,t.return,P)}if(e=t.sibling,e!==null){e.return=t.return,ae=e;break}ae=t.return}return w=nx,nx=!1,w}function qu(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var l=i.destroy;i.destroy=void 0,l!==void 0&&eg(t,n,l)}i=i.next}while(i!==r)}}function ff(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function tg(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function GE(e){var t=e.alternate;t!==null&&(e.alternate=null,GE(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[$r],delete t[ds],delete t[Uh],delete t[WD],delete t[VD])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function KE(e){return e.tag===5||e.tag===3||e.tag===4}function rx(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||KE(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ng(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=xc));else if(r!==4&&(e=e.child,e!==null))for(ng(e,t,n),e=e.sibling;e!==null;)ng(e,t,n),e=e.sibling}function rg(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(rg(e,t,n),e=e.sibling;e!==null;)rg(e,t,n),e=e.sibling}var Ut=null,_r=!1;function Ri(e,t,n){for(n=n.child;n!==null;)QE(e,t,n),n=n.sibling}function QE(e,t,n){if(Hr&&typeof Hr.onCommitFiberUnmount=="function")try{Hr.onCommitFiberUnmount(nf,n)}catch{}switch(n.tag){case 5:Jt||Ol(n,t);case 6:var r=Ut,i=_r;Ut=null,Ri(e,t,n),Ut=r,_r=i,Ut!==null&&(_r?(e=Ut,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Ut.removeChild(n.stateNode));break;case 18:Ut!==null&&(_r?(e=Ut,n=n.stateNode,e.nodeType===8?Op(e.parentNode,n):e.nodeType===1&&Op(e,n),us(e)):Op(Ut,n.stateNode));break;case 4:r=Ut,i=_r,Ut=n.stateNode.containerInfo,_r=!0,Ri(e,t,n),Ut=r,_r=i;break;case 0:case 11:case 14:case 15:if(!Jt&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var l=i,s=l.destroy;l=l.tag,s!==void 0&&((l&2)!==0||(l&4)!==0)&&eg(n,t,s),i=i.next}while(i!==r)}Ri(e,t,n);break;case 1:if(!Jt&&(Ol(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){wt(n,t,a)}Ri(e,t,n);break;case 21:Ri(e,t,n);break;case 22:n.mode&1?(Jt=(r=Jt)||n.memoizedState!==null,Ri(e,t,n),Jt=r):Ri(e,t,n);break;default:Ri(e,t,n)}}function ix(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new uL),t.forEach(function(r){var i=vL.bind(null,e,r);n.has(r)||(n.add(r),r.then(i,i))})}}function Cr(e,t){var n=t.deletions;if(n!==null)for(var r=0;ri&&(i=s),r&=~l}if(r=i,r=kt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*cL(r/1960))-r,10e?16:e,Bi===null)var r=!1;else{if(e=Bi,Bi=null,Ac=0,(Be&6)!==0)throw Error(te(331));var i=Be;for(Be|=4,ae=e.current;ae!==null;){var l=ae,s=l.child;if((ae.flags&16)!==0){var a=l.deletions;if(a!==null){for(var f=0;fkt()-Cm?Po(e,0):Em|=n),_n(e,t)}function rC(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ia,Ia<<=1,(Ia&130023424)===0&&(Ia=4194304)));var n=cn();e=pi(e,t),e!==null&&(_s(e,t,n),_n(e,n))}function mL(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),rC(e,n)}function vL(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(te(314))}r!==null&&r.delete(t),rC(e,n)}var iC;iC=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Cn.current)Sn=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return Sn=!1,iL(e,t,n);Sn=(e.flags&131072)!==0}else Sn=!1,ft&&(t.flags&1048576)!==0&&uE(t,Cc,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;tc(e,t),e=t.pendingProps;var i=jl(t,tn.current);Ll(t,n),i=mm(null,t,r,e,i,n);var l=vm();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,kn(r)?(l=!0,Sc(t)):l=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,fm(t),i.updater=af,t.stateNode=i,i._reactInternals=t,Gh(t,r,e,n),t=Yh(null,t,r,!0,l,n)):(t.tag=0,ft&&l&&im(t),sn(null,t,i,n),t=t.child),t;case 16:r=t.elementType;e:{switch(tc(e,t),e=t.pendingProps,i=r._init,r=i(r._payload),t.type=r,i=t.tag=xL(r),e=kr(r,e),i){case 0:t=Qh(null,t,r,e,n);break e;case 1:t=J1(null,t,r,e,n);break e;case 11:t=X1(null,t,r,e,n);break e;case 14:t=Z1(null,t,r,kr(r.type,e),n);break e}throw Error(te(306,r,""))}return t;case 0:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:kr(r,i),Qh(e,t,r,i,n);case 1:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:kr(r,i),J1(e,t,r,i,n);case 3:e:{if(UE(t),e===null)throw Error(te(387));r=t.pendingProps,l=t.memoizedState,i=l.element,fE(e,t),bc(t,r,null,n);var s=t.memoizedState;if(r=s.element,l.isDehydrated)if(l={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){i=Gl(Error(te(423)),t),t=ex(e,t,r,n,i);break e}else if(r!==i){i=Gl(Error(te(424)),t),t=ex(e,t,r,n,i);break e}else for(Nn=Wi(t.stateNode.containerInfo.firstChild),zn=t,ft=!0,br=null,n=gE(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Wl(),r===i){t=hi(e,t,n);break e}sn(e,t,r,n)}t=t.child}return t;case 5:return mE(t),e===null&&Wh(t),r=t.type,i=t.pendingProps,l=e!==null?e.memoizedProps:null,s=i.children,$h(r,i)?s=null:l!==null&&$h(r,l)&&(t.flags|=32),BE(e,t),sn(e,t,s,n),t.child;case 6:return e===null&&Wh(t),null;case 13:return HE(e,t,n);case 4:return dm(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Vl(t,null,r,n):sn(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:kr(r,i),X1(e,t,r,i,n);case 7:return sn(e,t,t.pendingProps,n),t.child;case 8:return sn(e,t,t.pendingProps.children,n),t.child;case 12:return sn(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,l=t.memoizedProps,s=i.value,tt(kc,r._currentValue),r._currentValue=s,l!==null)if(Rr(l.value,s)){if(l.children===i.children&&!Cn.current){t=hi(e,t,n);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var a=l.dependencies;if(a!==null){s=l.child;for(var f=a.firstContext;f!==null;){if(f.context===r){if(l.tag===1){f=ci(-1,n&-n),f.tag=2;var d=l.updateQueue;if(d!==null){d=d.shared;var h=d.pending;h===null?f.next=f:(f.next=h.next,h.next=f),d.pending=f}}l.lanes|=n,f=l.alternate,f!==null&&(f.lanes|=n),Vh(l.return,n,t),a.lanes|=n;break}f=f.next}}else if(l.tag===10)s=l.type===t.type?null:l.child;else if(l.tag===18){if(s=l.return,s===null)throw Error(te(341));s.lanes|=n,a=s.alternate,a!==null&&(a.lanes|=n),Vh(s,n,t),s=l.sibling}else s=l.child;if(s!==null)s.return=l;else for(s=l;s!==null;){if(s===t){s=null;break}if(l=s.sibling,l!==null){l.return=s.return,s=l;break}s=s.return}l=s}sn(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=t.pendingProps.children,Ll(t,n),i=dr(i),r=r(i),t.flags|=1,sn(e,t,r,n),t.child;case 14:return r=t.type,i=kr(r,t.pendingProps),i=kr(r.type,i),Z1(e,t,r,i,n);case 15:return zE(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:kr(r,i),tc(e,t),t.tag=1,kn(r)?(e=!0,Sc(t)):e=!1,Ll(t,n),pE(t,r,i),Gh(t,r,i,n),Yh(null,t,r,!0,e,n);case 19:return jE(e,t,n);case 22:return $E(e,t,n)}throw Error(te(156,t.tag))};function oC(e,t){return PS(e,t)}function yL(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function sr(e,t,n,r){return new yL(e,t,n,r)}function Om(e){return e=e.prototype,!(!e||!e.isReactComponent)}function xL(e){if(typeof e=="function")return Om(e)?1:0;if(e!=null){if(e=e.$$typeof,e===qg)return 11;if(e===Gg)return 14}return 2}function Ki(e,t){var n=e.alternate;return n===null?(n=sr(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function ic(e,t,n,r,i,l){var s=2;if(r=e,typeof e=="function")Om(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case yl:return Ao(n.children,i,l,t);case Vg:s=8,i|=8;break;case vh:return e=sr(12,n,t,i|2),e.elementType=vh,e.lanes=l,e;case yh:return e=sr(13,n,t,i),e.elementType=yh,e.lanes=l,e;case xh:return e=sr(19,n,t,i),e.elementType=xh,e.lanes=l,e;case hS:return pf(n,i,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case dS:s=10;break e;case pS:s=9;break e;case qg:s=11;break e;case Gg:s=14;break e;case Di:s=16,r=null;break e}throw Error(te(130,e==null?e:typeof e,""))}return t=sr(s,n,t,i),t.elementType=e,t.type=r,t.lanes=l,t}function Ao(e,t,n,r){return e=sr(7,e,r,t),e.lanes=n,e}function pf(e,t,n,r){return e=sr(22,e,r,t),e.elementType=hS,e.lanes=n,e.stateNode={isHidden:!1},e}function Mp(e,t,n){return e=sr(6,e,null,t),e.lanes=n,e}function Np(e,t,n){return t=sr(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function wL(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=mp(0),this.expirationTimes=mp(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=mp(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function Im(e,t,n,r,i,l,s,a,f){return e=new wL(e,t,n,a,f),t===1?(t=1,l===!0&&(t|=8)):t=0,l=sr(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},fm(l),e}function SL(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(n){console.error(n)}}t(),e.exports=jn})(Vo);const Ba=Fg(Vo.exports);var aC,dx=Vo.exports;aC=dx.createRoot,dx.hydrateRoot;var cC={exports:{}},fC={};var Ql=T.exports;function bL(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var OL=typeof Object.is=="function"?Object.is:bL,IL=Ql.useState,TL=Ql.useEffect,RL=Ql.useLayoutEffect,PL=Ql.useDebugValue;function AL(e,t){var n=t(),r=IL({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return RL(function(){i.value=n,i.getSnapshot=t,Fp(i)&&l({inst:i})},[e,n,t]),TL(function(){return Fp(i)&&l({inst:i}),e(function(){Fp(i)&&l({inst:i})})},[e]),PL(n),n}function Fp(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!OL(e,n)}catch{return!0}}function DL(e,t){return t()}var LL=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?DL:AL;fC.useSyncExternalStore=Ql.useSyncExternalStore!==void 0?Ql.useSyncExternalStore:LL;(function(e){e.exports=fC})(cC);var dC={exports:{}},pC={};var yf=T.exports,ML=cC.exports;function NL(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var FL=typeof Object.is=="function"?Object.is:NL,zL=ML.useSyncExternalStore,$L=yf.useRef,BL=yf.useEffect,UL=yf.useMemo,HL=yf.useDebugValue;pC.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var l=$L(null);if(l.current===null){var s={hasValue:!1,value:null};l.current=s}else s=l.current;l=UL(function(){function f(m){if(!d){if(d=!0,h=m,m=r(m),i!==void 0&&s.hasValue){var w=s.value;if(i(w,m))return g=w}return g=m}if(w=g,FL(h,m))return w;var E=r(m);return i!==void 0&&i(w,E)?w:(h=m,g=E)}var d=!1,h,g,y=n===void 0?null:n;return[function(){return f(t())},y===null?void 0:function(){return f(y())}]},[t,n,r,i]);var a=zL(e,l[0],l[1]);return BL(function(){s.hasValue=!0,s.value=a},[a]),HL(a),a};(function(e){e.exports=pC})(dC);function jL(e){e()}let hC=jL;const WL=e=>hC=e,VL=()=>hC,no=T.exports.createContext(null);function gC(){return T.exports.useContext(no)}const qL=()=>{throw new Error("uSES not initialized!")};let mC=qL;const GL=e=>{mC=e},KL=(e,t)=>e===t;function QL(e=no){const t=e===no?gC:()=>T.exports.useContext(e);return function(r,i=KL){const{store:l,subscription:s,getServerState:a}=t(),f=mC(s.addNestedSub,l.getState,a||l.getState,r,i);return T.exports.useDebugValue(f),f}}const YL=QL();function Mc(){return Mc=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[i]=e[i]);return n}var vC={exports:{}},Ye={};var Ft=typeof Symbol=="function"&&Symbol.for,Dm=Ft?Symbol.for("react.element"):60103,Lm=Ft?Symbol.for("react.portal"):60106,xf=Ft?Symbol.for("react.fragment"):60107,wf=Ft?Symbol.for("react.strict_mode"):60108,Sf=Ft?Symbol.for("react.profiler"):60114,Ef=Ft?Symbol.for("react.provider"):60109,Cf=Ft?Symbol.for("react.context"):60110,Mm=Ft?Symbol.for("react.async_mode"):60111,kf=Ft?Symbol.for("react.concurrent_mode"):60111,_f=Ft?Symbol.for("react.forward_ref"):60112,bf=Ft?Symbol.for("react.suspense"):60113,XL=Ft?Symbol.for("react.suspense_list"):60120,Of=Ft?Symbol.for("react.memo"):60115,If=Ft?Symbol.for("react.lazy"):60116,ZL=Ft?Symbol.for("react.block"):60121,JL=Ft?Symbol.for("react.fundamental"):60117,eM=Ft?Symbol.for("react.responder"):60118,tM=Ft?Symbol.for("react.scope"):60119;function Vn(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case Dm:switch(e=e.type,e){case Mm:case kf:case xf:case Sf:case wf:case bf:return e;default:switch(e=e&&e.$$typeof,e){case Cf:case _f:case If:case Of:case Ef:return e;default:return t}}case Lm:return t}}}function yC(e){return Vn(e)===kf}Ye.AsyncMode=Mm;Ye.ConcurrentMode=kf;Ye.ContextConsumer=Cf;Ye.ContextProvider=Ef;Ye.Element=Dm;Ye.ForwardRef=_f;Ye.Fragment=xf;Ye.Lazy=If;Ye.Memo=Of;Ye.Portal=Lm;Ye.Profiler=Sf;Ye.StrictMode=wf;Ye.Suspense=bf;Ye.isAsyncMode=function(e){return yC(e)||Vn(e)===Mm};Ye.isConcurrentMode=yC;Ye.isContextConsumer=function(e){return Vn(e)===Cf};Ye.isContextProvider=function(e){return Vn(e)===Ef};Ye.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===Dm};Ye.isForwardRef=function(e){return Vn(e)===_f};Ye.isFragment=function(e){return Vn(e)===xf};Ye.isLazy=function(e){return Vn(e)===If};Ye.isMemo=function(e){return Vn(e)===Of};Ye.isPortal=function(e){return Vn(e)===Lm};Ye.isProfiler=function(e){return Vn(e)===Sf};Ye.isStrictMode=function(e){return Vn(e)===wf};Ye.isSuspense=function(e){return Vn(e)===bf};Ye.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===xf||e===kf||e===Sf||e===wf||e===bf||e===XL||typeof e=="object"&&e!==null&&(e.$$typeof===If||e.$$typeof===Of||e.$$typeof===Ef||e.$$typeof===Cf||e.$$typeof===_f||e.$$typeof===JL||e.$$typeof===eM||e.$$typeof===tM||e.$$typeof===ZL)};Ye.typeOf=Vn;(function(e){e.exports=Ye})(vC);var xC=vC.exports,nM={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},rM={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},wC={};wC[xC.ForwardRef]=nM;wC[xC.Memo]=rM;var SC={exports:{}},Xe={};var Nm=Symbol.for("react.element"),Fm=Symbol.for("react.portal"),Tf=Symbol.for("react.fragment"),Rf=Symbol.for("react.strict_mode"),Pf=Symbol.for("react.profiler"),Af=Symbol.for("react.provider"),Df=Symbol.for("react.context"),iM=Symbol.for("react.server_context"),Lf=Symbol.for("react.forward_ref"),Mf=Symbol.for("react.suspense"),Nf=Symbol.for("react.suspense_list"),Ff=Symbol.for("react.memo"),zf=Symbol.for("react.lazy"),oM=Symbol.for("react.offscreen"),EC;EC=Symbol.for("react.module.reference");function hr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case Nm:switch(e=e.type,e){case Tf:case Pf:case Rf:case Mf:case Nf:return e;default:switch(e=e&&e.$$typeof,e){case iM:case Df:case Lf:case zf:case Ff:case Af:return e;default:return t}}case Fm:return t}}}Xe.ContextConsumer=Df;Xe.ContextProvider=Af;Xe.Element=Nm;Xe.ForwardRef=Lf;Xe.Fragment=Tf;Xe.Lazy=zf;Xe.Memo=Ff;Xe.Portal=Fm;Xe.Profiler=Pf;Xe.StrictMode=Rf;Xe.Suspense=Mf;Xe.SuspenseList=Nf;Xe.isAsyncMode=function(){return!1};Xe.isConcurrentMode=function(){return!1};Xe.isContextConsumer=function(e){return hr(e)===Df};Xe.isContextProvider=function(e){return hr(e)===Af};Xe.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===Nm};Xe.isForwardRef=function(e){return hr(e)===Lf};Xe.isFragment=function(e){return hr(e)===Tf};Xe.isLazy=function(e){return hr(e)===zf};Xe.isMemo=function(e){return hr(e)===Ff};Xe.isPortal=function(e){return hr(e)===Fm};Xe.isProfiler=function(e){return hr(e)===Pf};Xe.isStrictMode=function(e){return hr(e)===Rf};Xe.isSuspense=function(e){return hr(e)===Mf};Xe.isSuspenseList=function(e){return hr(e)===Nf};Xe.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Tf||e===Pf||e===Rf||e===Mf||e===Nf||e===oM||typeof e=="object"&&e!==null&&(e.$$typeof===zf||e.$$typeof===Ff||e.$$typeof===Af||e.$$typeof===Df||e.$$typeof===Lf||e.$$typeof===EC||e.getModuleId!==void 0)};Xe.typeOf=hr;(function(e){e.exports=Xe})(SC);const lM=Fg(SC.exports);function uM(){const e=VL();let t=null,n=null;return{clear(){t=null,n=null},notify(){e(()=>{let r=t;for(;r;)r.callback(),r=r.next})},get(){let r=[],i=t;for(;i;)r.push(i),i=i.next;return r},subscribe(r){let i=!0,l=n={callback:r,next:null,prev:n};return l.prev?l.prev.next=l:t=l,function(){!i||t===null||(i=!1,l.next?l.next.prev=l.prev:n=l.prev,l.prev?l.prev.next=l.next:t=l.next)}}}}const px={notify(){},get:()=>[]};function sM(e,t){let n,r=px;function i(g){return f(),r.subscribe(g)}function l(){r.notify()}function s(){h.onStateChange&&h.onStateChange()}function a(){return Boolean(n)}function f(){n||(n=t?t.addNestedSub(s):e.subscribe(s),r=uM())}function d(){n&&(n(),n=void 0,r.clear(),r=px)}const h={addNestedSub:i,notifyNestedSubs:l,handleChangeWrapper:s,isSubscribed:a,trySubscribe:f,tryUnsubscribe:d,getListeners:()=>r};return h}const aM=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",cM=aM?T.exports.useLayoutEffect:T.exports.useEffect;function fM({store:e,context:t,children:n,serverState:r}){const i=T.exports.useMemo(()=>{const a=sM(e);return{store:e,subscription:a,getServerState:r?()=>r:void 0}},[e,r]),l=T.exports.useMemo(()=>e.getState(),[e]);cM(()=>{const{subscription:a}=i;return a.onStateChange=a.notifyNestedSubs,a.trySubscribe(),l!==e.getState()&&a.notifyNestedSubs(),()=>{a.tryUnsubscribe(),a.onStateChange=void 0}},[i,l]);const s=t||no;return be.createElement(s.Provider,{value:i},n)}function CC(e=no){const t=e===no?gC:()=>T.exports.useContext(e);return function(){const{store:r}=t();return r}}const dM=CC();function pM(e=no){const t=e===no?dM:CC(e);return function(){return t().dispatch}}const hM=pM();GL(dC.exports.useSyncExternalStoreWithSelector);WL(Vo.exports.unstable_batchedUpdates);const kC=T.exports.createContext({dragDropManager:void 0});function xs(e){return xs=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},xs(e)}function gM(e,t){if(xs(e)!=="object"||e===null)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||"default");if(xs(r)!=="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function mM(e){var t=gM(e,"string");return xs(t)==="symbol"?t:String(t)}function vM(e,t,n){return t=mM(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function hx(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function gx(e){for(var t=1;t"u"&&(n=t,t=void 0),typeof n<"u"){if(typeof n!="function")throw new Error(Xt(1));return n(zm)(e,t)}if(typeof e!="function")throw new Error(Xt(2));var i=e,l=t,s=[],a=s,f=!1;function d(){a===s&&(a=s.slice())}function h(){if(f)throw new Error(Xt(3));return l}function g(E){if(typeof E!="function")throw new Error(Xt(4));if(f)throw new Error(Xt(5));var A=!0;return d(),a.push(E),function(){if(!!A){if(f)throw new Error(Xt(6));A=!1,d();var S=a.indexOf(E);a.splice(S,1),s=null}}}function y(E){if(!yM(E))throw new Error(Xt(7));if(typeof E.type>"u")throw new Error(Xt(8));if(f)throw new Error(Xt(9));try{f=!0,l=i(l,E)}finally{f=!1}for(var A=s=a,v=0;v"u")throw new Error(Xt(12));if(typeof n(void 0,{type:Nc.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Xt(13))})}function wM(e){for(var t=Object.keys(e),n={},r=0;r"u")throw d&&d.type,new Error(Xt(14));g[m]=A,h=h||A!==E}return h=h||l.length!==Object.keys(f).length,h?g:f}}function Fc(){for(var e=arguments.length,t=new Array(e),n=0;nr&&r[i]?r[i]:n||null,e)}function kM(e,t){return e.filter(n=>n!==t)}function _C(e){return typeof e=="object"}function _M(e,t){const n=new Map,r=l=>{n.set(l,n.has(l)?n.get(l)+1:1)};e.forEach(r),t.forEach(r);const i=[];return n.forEach((l,s)=>{l===1&&i.push(s)}),i}function bM(e,t){return e.filter(n=>t.indexOf(n)>-1)}const $m="dnd-core/INIT_COORDS",$f="dnd-core/BEGIN_DRAG",Bm="dnd-core/PUBLISH_DRAG_SOURCE",Bf="dnd-core/HOVER",Uf="dnd-core/DROP",Hf="dnd-core/END_DRAG";function vx(e,t){return{type:$m,payload:{sourceClientOffset:t||null,clientOffset:e||null}}}const OM={type:$m,payload:{clientOffset:null,sourceClientOffset:null}};function IM(e){return function(n=[],r={publishSource:!0}){const{publishSource:i=!0,clientOffset:l,getSourceClientOffset:s}=r,a=e.getMonitor(),f=e.getRegistry();e.dispatch(vx(l)),TM(n,a,f);const d=AM(n,a);if(d==null){e.dispatch(OM);return}let h=null;if(l){if(!s)throw new Error("getSourceClientOffset must be defined");RM(s),h=s(d)}e.dispatch(vx(l,h));const y=f.getSource(d).beginDrag(a,d);if(y==null)return;PM(y),f.pinSource(d);const m=f.getSourceType(d);return{type:$f,payload:{itemType:m,item:y,sourceId:d,clientOffset:l||null,sourceClientOffset:h||null,isSourcePublic:!!i}}}}function TM(e,t,n){_e(!t.isDragging(),"Cannot call beginDrag while dragging."),e.forEach(function(r){_e(n.getSource(r),"Expected sourceIds to be registered.")})}function RM(e){_e(typeof e=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function PM(e){_e(_C(e),"Item must be an object.")}function AM(e,t){let n=null;for(let r=e.length-1;r>=0;r--)if(t.canDragSource(e[r])){n=e[r];break}return n}function DM(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function LM(e){for(var t=1;t{const f=FM(s,a,i,r),d={type:Uf,payload:{dropResult:LM({},n,f)}};e.dispatch(d)})}}function NM(e){_e(e.isDragging(),"Cannot call drop while not dragging."),_e(!e.didDrop(),"Cannot call drop twice during one drag operation.")}function FM(e,t,n,r){const i=n.getTarget(e);let l=i?i.drop(r,e):void 0;return zM(l),typeof l>"u"&&(l=t===0?{}:r.getDropResult()),l}function zM(e){_e(typeof e>"u"||_C(e),"Drop result must either be an object or undefined.")}function $M(e){const t=e.getTargetIds().filter(e.canDropOnTarget,e);return t.reverse(),t}function BM(e){return function(){const n=e.getMonitor(),r=e.getRegistry();UM(n);const i=n.getSourceId();return i!=null&&(r.getSource(i,!0).endDrag(n,i),r.unpinSource()),{type:Hf}}}function UM(e){_e(e.isDragging(),"Cannot call endDrag while not dragging.")}function sg(e,t){return t===null?e===null:Array.isArray(e)?e.some(n=>n===t):e===t}function HM(e){return function(n,{clientOffset:r}={}){jM(n);const i=n.slice(0),l=e.getMonitor(),s=e.getRegistry(),a=l.getItemType();return VM(i,s,a),WM(i,l,s),qM(i,l,s),{type:Bf,payload:{targetIds:i,clientOffset:r||null}}}}function jM(e){_e(Array.isArray(e),"Expected targetIds to be an array.")}function WM(e,t,n){_e(t.isDragging(),"Cannot call hover while not dragging."),_e(!t.didDrop(),"Cannot call hover after drop.");for(let r=0;r=0;r--){const i=e[r],l=t.getTargetType(i);sg(l,n)||e.splice(r,1)}}function qM(e,t,n){e.forEach(function(r){n.getTarget(r).hover(t,r)})}function GM(e){return function(){if(e.getMonitor().isDragging())return{type:Bm}}}function KM(e){return{beginDrag:IM(e),publishDragSource:GM(e),hover:HM(e),drop:MM(e),endDrag:BM(e)}}class QM{receiveBackend(t){this.backend=t}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const t=this,{dispatch:n}=this.store;function r(l){return(...s)=>{const a=l.apply(t,s);typeof a<"u"&&n(a)}}const i=KM(this);return Object.keys(i).reduce((l,s)=>{const a=i[s];return l[s]=r(a),l},{})}dispatch(t){this.store.dispatch(t)}constructor(t,n){this.isSetUp=!1,this.handleRefCountChange=()=>{const r=this.store.getState().refCount>0;this.backend&&(r&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!r&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=t,this.monitor=n,t.subscribe(this.handleRefCountChange)}}function YM(e,t){return{x:e.x+t.x,y:e.y+t.y}}function bC(e,t){return{x:e.x-t.x,y:e.y-t.y}}function XM(e){const{clientOffset:t,initialClientOffset:n,initialSourceClientOffset:r}=e;return!t||!n||!r?null:bC(YM(t,r),n)}function ZM(e){const{clientOffset:t,initialClientOffset:n}=e;return!t||!n?null:bC(t,n)}const Qu=[],Um=[];Qu.__IS_NONE__=!0;Um.__IS_ALL__=!0;function JM(e,t){return e===Qu?!1:e===Um||typeof t>"u"?!0:bM(t,e).length>0}class eN{subscribeToStateChange(t,n={}){const{handlerIds:r}=n;_e(typeof t=="function","listener must be a function."),_e(typeof r>"u"||Array.isArray(r),"handlerIds, when specified, must be an array of strings.");let i=this.store.getState().stateId;const l=()=>{const s=this.store.getState(),a=s.stateId;try{a===i||a===i+1&&!JM(s.dirtyHandlerIds,r)||t()}finally{i=a}};return this.store.subscribe(l)}subscribeToOffsetChange(t){_e(typeof t=="function","listener must be a function.");let n=this.store.getState().dragOffset;const r=()=>{const i=this.store.getState().dragOffset;i!==n&&(n=i,t())};return this.store.subscribe(r)}canDragSource(t){if(!t)return!1;const n=this.registry.getSource(t);return _e(n,`Expected to find a valid source. sourceId=${t}`),this.isDragging()?!1:n.canDrag(this,t)}canDropOnTarget(t){if(!t)return!1;const n=this.registry.getTarget(t);if(_e(n,`Expected to find a valid target. targetId=${t}`),!this.isDragging()||this.didDrop())return!1;const r=this.registry.getTargetType(t),i=this.getItemType();return sg(r,i)&&n.canDrop(this,t)}isDragging(){return Boolean(this.getItemType())}isDraggingSource(t){if(!t)return!1;const n=this.registry.getSource(t,!0);if(_e(n,`Expected to find a valid source. sourceId=${t}`),!this.isDragging()||!this.isSourcePublic())return!1;const r=this.registry.getSourceType(t),i=this.getItemType();return r!==i?!1:n.isDragging(this,t)}isOverTarget(t,n={shallow:!1}){if(!t)return!1;const{shallow:r}=n;if(!this.isDragging())return!1;const i=this.registry.getTargetType(t),l=this.getItemType();if(l&&!sg(i,l))return!1;const s=this.getTargetIds();if(!s.length)return!1;const a=s.indexOf(t);return r?a===s.length-1:a>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return Boolean(this.store.getState().dragOperation.isSourcePublic)}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return XM(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return ZM(this.store.getState().dragOffset)}constructor(t,n){this.store=t,this.registry=n}}const yx=typeof global<"u"?global:self,OC=yx.MutationObserver||yx.WebKitMutationObserver;function IC(e){return function(){const n=setTimeout(i,0),r=setInterval(i,50);function i(){clearTimeout(n),clearInterval(r),e()}}}function tN(e){let t=1;const n=new OC(e),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){t=-t,r.data=t}}const nN=typeof OC=="function"?tN:IC;class rN{enqueueTask(t){const{queue:n,requestFlush:r}=this;n.length||(r(),this.flushing=!0),n[n.length]=t}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:t}=this;for(;this.indexthis.capacity){for(let r=0,i=t.length-this.index;r{this.pendingErrors.push(t),this.requestErrorThrow()},this.requestFlush=nN(this.flush),this.requestErrorThrow=IC(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class iN{call(){try{this.task&&this.task()}catch(t){this.onError(t)}finally{this.task=null,this.release(this)}}constructor(t,n){this.onError=t,this.release=n,this.task=null}}class oN{create(t){const n=this.freeTasks,r=n.length?n.pop():new iN(this.onError,i=>n[n.length]=i);return r.task=t,r}constructor(t){this.onError=t,this.freeTasks=[]}}const TC=new rN,lN=new oN(TC.registerPendingError);function uN(e){TC.enqueueTask(lN.create(e))}const Hm="dnd-core/ADD_SOURCE",jm="dnd-core/ADD_TARGET",Wm="dnd-core/REMOVE_SOURCE",jf="dnd-core/REMOVE_TARGET";function sN(e){return{type:Hm,payload:{sourceId:e}}}function aN(e){return{type:jm,payload:{targetId:e}}}function cN(e){return{type:Wm,payload:{sourceId:e}}}function fN(e){return{type:jf,payload:{targetId:e}}}function dN(e){_e(typeof e.canDrag=="function","Expected canDrag to be a function."),_e(typeof e.beginDrag=="function","Expected beginDrag to be a function."),_e(typeof e.endDrag=="function","Expected endDrag to be a function.")}function pN(e){_e(typeof e.canDrop=="function","Expected canDrop to be a function."),_e(typeof e.hover=="function","Expected hover to be a function."),_e(typeof e.drop=="function","Expected beginDrag to be a function.")}function ag(e,t){if(t&&Array.isArray(e)){e.forEach(n=>ag(n,!1));return}_e(typeof e=="string"||typeof e=="symbol",t?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var lr;(function(e){e.SOURCE="SOURCE",e.TARGET="TARGET"})(lr||(lr={}));let hN=0;function gN(){return hN++}function mN(e){const t=gN().toString();switch(e){case lr.SOURCE:return`S${t}`;case lr.TARGET:return`T${t}`;default:throw new Error(`Unknown Handler Role: ${e}`)}}function xx(e){switch(e[0]){case"S":return lr.SOURCE;case"T":return lr.TARGET;default:throw new Error(`Cannot parse handler ID: ${e}`)}}function wx(e,t){const n=e.entries();let r=!1;do{const{done:i,value:[,l]}=n.next();if(l===t)return!0;r=!!i}while(!r);return!1}class vN{addSource(t,n){ag(t),dN(n);const r=this.addHandler(lr.SOURCE,t,n);return this.store.dispatch(sN(r)),r}addTarget(t,n){ag(t,!0),pN(n);const r=this.addHandler(lr.TARGET,t,n);return this.store.dispatch(aN(r)),r}containsHandler(t){return wx(this.dragSources,t)||wx(this.dropTargets,t)}getSource(t,n=!1){return _e(this.isSourceId(t),"Expected a valid source ID."),n&&t===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(t)}getTarget(t){return _e(this.isTargetId(t),"Expected a valid target ID."),this.dropTargets.get(t)}getSourceType(t){return _e(this.isSourceId(t),"Expected a valid source ID."),this.types.get(t)}getTargetType(t){return _e(this.isTargetId(t),"Expected a valid target ID."),this.types.get(t)}isSourceId(t){return xx(t)===lr.SOURCE}isTargetId(t){return xx(t)===lr.TARGET}removeSource(t){_e(this.getSource(t),"Expected an existing source."),this.store.dispatch(cN(t)),uN(()=>{this.dragSources.delete(t),this.types.delete(t)})}removeTarget(t){_e(this.getTarget(t),"Expected an existing target."),this.store.dispatch(fN(t)),this.dropTargets.delete(t),this.types.delete(t)}pinSource(t){const n=this.getSource(t);_e(n,"Expected an existing source."),this.pinnedSourceId=t,this.pinnedSource=n}unpinSource(){_e(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(t,n,r){const i=mN(t);return this.types.set(i,n),t===lr.SOURCE?this.dragSources.set(i,r):t===lr.TARGET&&this.dropTargets.set(i,r),i}constructor(t){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=t}}const yN=(e,t)=>e===t;function xN(e,t){return!e&&!t?!0:!e||!t?!1:e.x===t.x&&e.y===t.y}function wN(e,t,n=yN){if(e.length!==t.length)return!1;for(let r=0;r0||!wN(n,r)))return Qu;const s=r[r.length-1],a=n[n.length-1];return s!==a&&(s&&i.push(s),a&&i.push(a)),i}function EN(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function CN(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,r)||(n[r]=e[r]))}return n}function NN(e,t){if(e==null)return{};var n={},r=Object.keys(e),i,l;for(l=0;l=0)&&(n[i]=e[i]);return n}let Ex=0;const oc=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var FN=T.exports.memo(function(t){var{children:n}=t,r=MN(t,["children"]);const[i,l]=zN(r);return T.exports.useEffect(()=>{if(l){const s=RC();return++Ex,()=>{--Ex===0&&(s[oc]=null)}}},[]),V(kC.Provider,{value:i,children:n})});function zN(e){if("manager"in e)return[{dragDropManager:e.manager},!1];const t=$N(e.backend,e.context,e.options,e.debugMode),n=!e.context;return[t,n]}function $N(e,t=RC(),n,r){const i=t;return i[oc]||(i[oc]={dragDropManager:DN(e,t,n,r)}),i[oc]}function RC(){return typeof global<"u"?global:window}var BN=function e(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var r,i,l;if(Array.isArray(t)){if(r=t.length,r!=n.length)return!1;for(i=r;i--!==0;)if(!e(t[i],n[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if(l=Object.keys(t),r=l.length,r!==Object.keys(n).length)return!1;for(i=r;i--!==0;)if(!Object.prototype.hasOwnProperty.call(n,l[i]))return!1;for(i=r;i--!==0;){var s=l[i];if(!e(t[s],n[s]))return!1}return!0}return t!==t&&n!==n};const Bo=typeof window<"u"?T.exports.useLayoutEffect:T.exports.useEffect;function PC(e,t,n){const[r,i]=T.exports.useState(()=>t(e)),l=T.exports.useCallback(()=>{const s=t(e);BN(r,s)||(i(s),n&&n())},[r,e,n]);return Bo(l),[r,l]}function UN(e,t,n){const[r,i]=PC(e,t,n);return Bo(function(){const s=e.getHandlerId();if(s!=null)return e.subscribeToStateChange(i,{handlerIds:[s]})},[e,i]),r}function AC(e,t,n){return UN(t,e||(()=>({})),()=>n.reconnect())}function DC(e,t){const n=[...t||[]];return t==null&&typeof e!="function"&&n.push(e),T.exports.useMemo(()=>typeof e=="function"?e():e,n)}function HN(e){return T.exports.useMemo(()=>e.hooks.dragSource(),[e])}function jN(e){return T.exports.useMemo(()=>e.hooks.dragPreview(),[e])}let $p=!1,Bp=!1;class WN{receiveHandlerId(t){this.sourceId=t}getHandlerId(){return this.sourceId}canDrag(){_e(!$p,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return $p=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{$p=!1}}isDragging(){if(!this.sourceId)return!1;_e(!Bp,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return Bp=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{Bp=!1}}subscribeToStateChange(t,n){return this.internalMonitor.subscribeToStateChange(t,n)}isDraggingSource(t){return this.internalMonitor.isDraggingSource(t)}isOverTarget(t,n){return this.internalMonitor.isOverTarget(t,n)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(t){return this.internalMonitor.subscribeToOffsetChange(t)}canDragSource(t){return this.internalMonitor.canDragSource(t)}canDropOnTarget(t){return this.internalMonitor.canDropOnTarget(t)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.sourceId=null,this.internalMonitor=t.getMonitor()}}let Up=!1;class VN{receiveHandlerId(t){this.targetId=t}getHandlerId(){return this.targetId}subscribeToStateChange(t,n){return this.internalMonitor.subscribeToStateChange(t,n)}canDrop(){if(!this.targetId)return!1;_e(!Up,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return Up=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{Up=!1}}isOver(t){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,t):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.targetId=null,this.internalMonitor=t.getMonitor()}}function qN(e,t,n){const r=n.getRegistry(),i=r.addTarget(e,t);return[i,()=>r.removeTarget(i)]}function GN(e,t,n){const r=n.getRegistry(),i=r.addSource(e,t);return[i,()=>r.removeSource(i)]}function cg(e,t,n,r){let i=n?n.call(r,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!="object"||!e||typeof t!="object"||!t)return!1;const l=Object.keys(e),s=Object.keys(t);if(l.length!==s.length)return!1;const a=Object.prototype.hasOwnProperty.bind(t);for(let f=0;f, or turn it into a drag source or a drop target itself.`)}function QN(e){return(t=null,n=null)=>{if(!T.exports.isValidElement(t)){const l=t;return e(l,n),l}const r=t;return KN(r),YN(r,n?l=>e(l,n):e)}}function LC(e){const t={};return Object.keys(e).forEach(n=>{const r=e[n];if(n.endsWith("Ref"))t[n]=e[n];else{const i=QN(r);t[n]=()=>i}}),t}function Cx(e,t){typeof e=="function"?e(t):e.current=t}function YN(e,t){const n=e.ref;return _e(typeof n!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),n?T.exports.cloneElement(e,{ref:r=>{Cx(n,r),Cx(t,r)}}):T.exports.cloneElement(e,{ref:t})}class XN{receiveHandlerId(t){this.handlerId!==t&&(this.handlerId=t,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(t){this.dragSourceOptionsInternal=t}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(t){this.dragPreviewOptionsInternal=t}reconnect(){const t=this.reconnectDragSource();this.reconnectDragPreview(t)}reconnectDragSource(){const t=this.dragSource,n=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return n&&this.disconnectDragSource(),this.handlerId?t?(n&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=t,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,t,this.dragSourceOptions)),n):(this.lastConnectedDragSource=t,n):n}reconnectDragPreview(t=!1){const n=this.dragPreview,r=t||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(r&&this.disconnectDragPreview(),!!this.handlerId){if(!n){this.lastConnectedDragPreview=n;return}r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=n,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,n,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!cg(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!cg(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(t){this.hooks=LC({dragSource:(n,r)=>{this.clearDragSource(),this.dragSourceOptions=r||null,fg(n)?this.dragSourceRef=n:this.dragSourceNode=n,this.reconnectDragSource()},dragPreview:(n,r)=>{this.clearDragPreview(),this.dragPreviewOptions=r||null,fg(n)?this.dragPreviewRef=n:this.dragPreviewNode=n,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=t}}class ZN{get connectTarget(){return this.dropTarget}reconnect(){const t=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();t&&this.disconnectDropTarget();const n=this.dropTarget;if(!!this.handlerId){if(!n){this.lastConnectedDropTarget=n;return}t&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=n,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,n,this.dropTargetOptions))}}receiveHandlerId(t){t!==this.handlerId&&(this.handlerId=t,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(t){this.dropTargetOptionsInternal=t}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!cg(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(t){this.hooks=LC({dropTarget:(n,r)=>{this.clearDropTarget(),this.dropTargetOptions=r,fg(n)?this.dropTargetRef=n:this.dropTargetNode=n,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=t}}function vi(){const{dragDropManager:e}=T.exports.useContext(kC);return _e(e!=null,"Expected drag drop context"),e}function JN(e,t){const n=vi(),r=T.exports.useMemo(()=>new XN(n.getBackend()),[n]);return Bo(()=>(r.dragSourceOptions=e||null,r.reconnect(),()=>r.disconnectDragSource()),[r,e]),Bo(()=>(r.dragPreviewOptions=t||null,r.reconnect(),()=>r.disconnectDragPreview()),[r,t]),r}function eF(){const e=vi();return T.exports.useMemo(()=>new WN(e),[e])}class tF{beginDrag(){const t=this.spec,n=this.monitor;let r=null;return typeof t.item=="object"?r=t.item:typeof t.item=="function"?r=t.item(n):r={},r??null}canDrag(){const t=this.spec,n=this.monitor;return typeof t.canDrag=="boolean"?t.canDrag:typeof t.canDrag=="function"?t.canDrag(n):!0}isDragging(t,n){const r=this.spec,i=this.monitor,{isDragging:l}=r;return l?l(i):n===t.getSourceId()}endDrag(){const t=this.spec,n=this.monitor,r=this.connector,{end:i}=t;i&&i(n.getItem(),n),r.reconnect()}constructor(t,n,r){this.spec=t,this.monitor=n,this.connector=r}}function nF(e,t,n){const r=T.exports.useMemo(()=>new tF(e,t,n),[t,n]);return T.exports.useEffect(()=>{r.spec=e},[e]),r}function rF(e){return T.exports.useMemo(()=>{const t=e.type;return _e(t!=null,"spec.type must be defined"),t},[e])}function iF(e,t,n){const r=vi(),i=nF(e,t,n),l=rF(e);Bo(function(){if(l!=null){const[a,f]=GN(l,i,r);return t.receiveHandlerId(a),n.receiveHandlerId(a),f}},[r,t,n,i,l])}function oF(e,t){const n=DC(e,t);_e(!n.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const r=eF(),i=JN(n.options,n.previewOptions);return iF(n,r,i),[AC(n.collect,r,i),HN(i),jN(i)]}function lF(e){const n=vi().getMonitor(),[r,i]=PC(n,e);return T.exports.useEffect(()=>n.subscribeToOffsetChange(i)),T.exports.useEffect(()=>n.subscribeToStateChange(i)),r}function uF(e){return T.exports.useMemo(()=>e.hooks.dropTarget(),[e])}function sF(e){const t=vi(),n=T.exports.useMemo(()=>new ZN(t.getBackend()),[t]);return Bo(()=>(n.dropTargetOptions=e||null,n.reconnect(),()=>n.disconnectDropTarget()),[e]),n}function aF(){const e=vi();return T.exports.useMemo(()=>new VN(e),[e])}function cF(e){const{accept:t}=e;return T.exports.useMemo(()=>(_e(e.accept!=null,"accept must be defined"),Array.isArray(t)?t:[t]),[t])}class fF{canDrop(){const t=this.spec,n=this.monitor;return t.canDrop?t.canDrop(n.getItem(),n):!0}hover(){const t=this.spec,n=this.monitor;t.hover&&t.hover(n.getItem(),n)}drop(){const t=this.spec,n=this.monitor;if(t.drop)return t.drop(n.getItem(),n)}constructor(t,n){this.spec=t,this.monitor=n}}function dF(e,t){const n=T.exports.useMemo(()=>new fF(e,t),[t]);return T.exports.useEffect(()=>{n.spec=e},[e]),n}function pF(e,t,n){const r=vi(),i=dF(e,t),l=cF(e);Bo(function(){const[a,f]=qN(l,i,r);return t.receiveHandlerId(a),n.receiveHandlerId(a),f},[r,t,i,n,l.map(s=>s.toString()).join("|")])}function dg(e,t){const n=DC(e,t),r=aF(),i=sF(n.options);return pF(n,r,i),[AC(n.collect,r,i),uF(i)]}var Qi;(function(e){e.mouse="mouse",e.touch="touch",e.keyboard="keyboard"})(Qi||(Qi={}));class hF{get delay(){var t;return(t=this.args.delay)!==null&&t!==void 0?t:0}get scrollAngleRanges(){return this.args.scrollAngleRanges}get getDropTargetElementsAtPoint(){return this.args.getDropTargetElementsAtPoint}get ignoreContextMenu(){var t;return(t=this.args.ignoreContextMenu)!==null&&t!==void 0?t:!1}get enableHoverOutsideTarget(){var t;return(t=this.args.enableHoverOutsideTarget)!==null&&t!==void 0?t:!1}get enableKeyboardEvents(){var t;return(t=this.args.enableKeyboardEvents)!==null&&t!==void 0?t:!1}get enableMouseEvents(){var t;return(t=this.args.enableMouseEvents)!==null&&t!==void 0?t:!1}get enableTouchEvents(){var t;return(t=this.args.enableTouchEvents)!==null&&t!==void 0?t:!0}get touchSlop(){return this.args.touchSlop||0}get delayTouchStart(){var t,n,r,i;return(i=(r=(t=this.args)===null||t===void 0?void 0:t.delayTouchStart)!==null&&r!==void 0?r:(n=this.args)===null||n===void 0?void 0:n.delay)!==null&&i!==void 0?i:0}get delayMouseStart(){var t,n,r,i;return(i=(r=(t=this.args)===null||t===void 0?void 0:t.delayMouseStart)!==null&&r!==void 0?r:(n=this.args)===null||n===void 0?void 0:n.delay)!==null&&i!==void 0?i:0}get window(){if(this.context&&this.context.window)return this.context.window;if(typeof window<"u")return window}get document(){var t;if(!((t=this.context)===null||t===void 0)&&t.document)return this.context.document;if(this.window)return this.window.document}get rootElement(){var t;return((t=this.args)===null||t===void 0?void 0:t.rootElement)||this.document}constructor(t,n){this.args=t,this.context=n}}function gF(e,t,n,r){return Math.sqrt(Math.pow(Math.abs(n-e),2)+Math.pow(Math.abs(r-t),2))}function mF(e,t,n,r,i){if(!i)return!1;const l=Math.atan2(r-t,n-e)*180/Math.PI+180;for(let s=0;s=a.start)&&(a.end==null||l<=a.end))return!0}return!1}const vF={Left:1,Right:2,Center:4},yF={Left:0,Center:1,Right:2};function Hp(e){return e.button===void 0||e.button===yF.Left}function xF(e){return e.buttons===void 0||(e.buttons&vF.Left)===0}function MC(e){return!!e.targetTouches}const wF=1;function SF(e){const t=e.nodeType===wF?e:e.parentElement;if(!t)return;const{top:n,left:r}=t.getBoundingClientRect();return{x:r,y:n}}function EF(e,t){if(e.targetTouches.length===1)return zc(e.targetTouches[0]);if(t&&e.touches.length===1&&e.touches[0].target===t.target)return zc(e.touches[0])}function zc(e,t){return MC(e)?EF(e,t):{x:e.clientX,y:e.clientY}}const kx=(()=>{let e=!1;try{addEventListener("test",()=>{},Object.defineProperty({},"passive",{get(){return e=!0,!0}}))}catch{}return e})(),Pu={[Qi.mouse]:{start:"mousedown",move:"mousemove",end:"mouseup",contextmenu:"contextmenu"},[Qi.touch]:{start:"touchstart",move:"touchmove",end:"touchend"},[Qi.keyboard]:{keydown:"keydown"}};class Yu{profile(){var t;return{sourceNodes:this.sourceNodes.size,sourcePreviewNodes:this.sourcePreviewNodes.size,sourcePreviewNodeOptions:this.sourcePreviewNodeOptions.size,targetNodes:this.targetNodes.size,dragOverTargetIds:((t=this.dragOverTargetIds)===null||t===void 0?void 0:t.length)||0}}get document(){return this.options.document}setup(){const t=this.options.rootElement;!t||(_e(!Yu.isSetUp,"Cannot have two Touch backends at the same time."),Yu.isSetUp=!0,this.addEventListener(t,"start",this.getTopMoveStartHandler()),this.addEventListener(t,"start",this.handleTopMoveStartCapture,!0),this.addEventListener(t,"move",this.handleTopMove),this.addEventListener(t,"move",this.handleTopMoveCapture,!0),this.addEventListener(t,"end",this.handleTopMoveEndCapture,!0),this.options.enableMouseEvents&&!this.options.ignoreContextMenu&&this.addEventListener(t,"contextmenu",this.handleTopMoveEndCapture),this.options.enableKeyboardEvents&&this.addEventListener(t,"keydown",this.handleCancelOnEscape,!0))}teardown(){const t=this.options.rootElement;!t||(Yu.isSetUp=!1,this._mouseClientOffset={},this.removeEventListener(t,"start",this.handleTopMoveStartCapture,!0),this.removeEventListener(t,"start",this.handleTopMoveStart),this.removeEventListener(t,"move",this.handleTopMoveCapture,!0),this.removeEventListener(t,"move",this.handleTopMove),this.removeEventListener(t,"end",this.handleTopMoveEndCapture,!0),this.options.enableMouseEvents&&!this.options.ignoreContextMenu&&this.removeEventListener(t,"contextmenu",this.handleTopMoveEndCapture),this.options.enableKeyboardEvents&&this.removeEventListener(t,"keydown",this.handleCancelOnEscape,!0),this.uninstallSourceNodeRemovalObserver())}addEventListener(t,n,r,i=!1){const l=kx?{capture:i,passive:!1}:i;this.listenerTypes.forEach(function(s){const a=Pu[s][n];a&&t.addEventListener(a,r,l)})}removeEventListener(t,n,r,i=!1){const l=kx?{capture:i,passive:!1}:i;this.listenerTypes.forEach(function(s){const a=Pu[s][n];a&&t.removeEventListener(a,r,l)})}connectDragSource(t,n){const r=this.handleMoveStart.bind(this,t);return this.sourceNodes.set(t,n),this.addEventListener(n,"start",r),()=>{this.sourceNodes.delete(t),this.removeEventListener(n,"start",r)}}connectDragPreview(t,n,r){return this.sourcePreviewNodeOptions.set(t,r),this.sourcePreviewNodes.set(t,n),()=>{this.sourcePreviewNodes.delete(t),this.sourcePreviewNodeOptions.delete(t)}}connectDropTarget(t,n){const r=this.options.rootElement;if(!this.document||!r)return()=>{};const i=l=>{if(!this.document||!r||!this.monitor.isDragging())return;let s;switch(l.type){case Pu.mouse.move:s={x:l.clientX,y:l.clientY};break;case Pu.touch.move:var a,f;s={x:((a=l.touches[0])===null||a===void 0?void 0:a.clientX)||0,y:((f=l.touches[0])===null||f===void 0?void 0:f.clientY)||0};break}const d=s!=null?this.document.elementFromPoint(s.x,s.y):void 0,h=d&&n.contains(d);if(d===n||h)return this.handleMove(l,t)};return this.addEventListener(this.document.body,"move",i),this.targetNodes.set(t,n),()=>{this.document&&(this.targetNodes.delete(t),this.removeEventListener(this.document.body,"move",i))}}getTopMoveStartHandler(){return!this.options.delayTouchStart&&!this.options.delayMouseStart?this.handleTopMoveStart:this.handleTopMoveStartDelay}installSourceNodeRemovalObserver(t){this.uninstallSourceNodeRemovalObserver(),this.draggedSourceNode=t,this.draggedSourceNodeRemovalObserver=new MutationObserver(()=>{t&&!t.parentElement&&(this.resurrectSourceNode(),this.uninstallSourceNodeRemovalObserver())}),!(!t||!t.parentElement)&&this.draggedSourceNodeRemovalObserver.observe(t.parentElement,{childList:!0})}resurrectSourceNode(){this.document&&this.draggedSourceNode&&(this.draggedSourceNode.style.display="none",this.draggedSourceNode.removeAttribute("data-reactid"),this.document.body.appendChild(this.draggedSourceNode))}uninstallSourceNodeRemovalObserver(){this.draggedSourceNodeRemovalObserver&&this.draggedSourceNodeRemovalObserver.disconnect(),this.draggedSourceNodeRemovalObserver=void 0,this.draggedSourceNode=void 0}constructor(t,n,r){this.getSourceClientOffset=i=>{const l=this.sourceNodes.get(i);return l&&SF(l)},this.handleTopMoveStartCapture=i=>{!Hp(i)||(this.moveStartSourceIds=[])},this.handleMoveStart=i=>{Array.isArray(this.moveStartSourceIds)&&this.moveStartSourceIds.unshift(i)},this.handleTopMoveStart=i=>{if(!Hp(i))return;const l=zc(i);l&&(MC(i)&&(this.lastTargetTouchFallback=i.targetTouches[0]),this._mouseClientOffset=l),this.waitingForDelay=!1},this.handleTopMoveStartDelay=i=>{if(!Hp(i))return;const l=i.type===Pu.touch.start?this.options.delayTouchStart:this.options.delayMouseStart;this.timeout=setTimeout(this.handleTopMoveStart.bind(this,i),l),this.waitingForDelay=!0},this.handleTopMoveCapture=()=>{this.dragOverTargetIds=[]},this.handleMove=(i,l)=>{this.dragOverTargetIds&&this.dragOverTargetIds.unshift(l)},this.handleTopMove=i=>{if(this.timeout&&clearTimeout(this.timeout),!this.document||this.waitingForDelay)return;const{moveStartSourceIds:l,dragOverTargetIds:s}=this,a=this.options.enableHoverOutsideTarget,f=zc(i,this.lastTargetTouchFallback);if(!f)return;if(this._isScrolling||!this.monitor.isDragging()&&mF(this._mouseClientOffset.x||0,this._mouseClientOffset.y||0,f.x,f.y,this.options.scrollAngleRanges)){this._isScrolling=!0;return}if(!this.monitor.isDragging()&&this._mouseClientOffset.hasOwnProperty("x")&&l&&gF(this._mouseClientOffset.x||0,this._mouseClientOffset.y||0,f.x,f.y)>(this.options.touchSlop?this.options.touchSlop:0)&&(this.moveStartSourceIds=void 0,this.actions.beginDrag(l,{clientOffset:this._mouseClientOffset,getSourceClientOffset:this.getSourceClientOffset,publishSource:!1})),!this.monitor.isDragging())return;const d=this.sourceNodes.get(this.monitor.getSourceId());this.installSourceNodeRemovalObserver(d),this.actions.publishDragSource(),i.cancelable&&i.preventDefault();const h=(s||[]).map(w=>this.targetNodes.get(w)).filter(w=>!!w),g=this.options.getDropTargetElementsAtPoint?this.options.getDropTargetElementsAtPoint(f.x,f.y,h):this.document.elementsFromPoint(f.x,f.y),y=[];for(const w in g){if(!g.hasOwnProperty(w))continue;let E=g[w];for(E!=null&&y.push(E);E;)E=E.parentElement,E&&y.indexOf(E)===-1&&y.push(E)}const m=y.filter(w=>h.indexOf(w)>-1).map(w=>this._getDropTargetId(w)).filter(w=>!!w).filter((w,E,A)=>A.indexOf(w)===E);if(a)for(const w in this.targetNodes){const E=this.targetNodes.get(w);if(d&&E&&E.contains(d)&&m.indexOf(w)===-1){m.unshift(w);break}}m.reverse(),this.actions.hover(m,{clientOffset:f})},this._getDropTargetId=i=>{const l=this.targetNodes.keys();let s=l.next();for(;s.done===!1;){const a=s.value;if(i===this.targetNodes.get(a))return a;s=l.next()}},this.handleTopMoveEndCapture=i=>{if(this._isScrolling=!1,this.lastTargetTouchFallback=void 0,!!xF(i)){if(!this.monitor.isDragging()||this.monitor.didDrop()){this.moveStartSourceIds=void 0;return}i.cancelable&&i.preventDefault(),this._mouseClientOffset={},this.uninstallSourceNodeRemovalObserver(),this.actions.drop(),this.actions.endDrag()}},this.handleCancelOnEscape=i=>{i.key==="Escape"&&this.monitor.isDragging()&&(this._mouseClientOffset={},this.uninstallSourceNodeRemovalObserver(),this.actions.endDrag())},this.options=new hF(r,n),this.actions=t.getActions(),this.monitor=t.getMonitor(),this.sourceNodes=new Map,this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.targetNodes=new Map,this.listenerTypes=[],this._mouseClientOffset={},this._isScrolling=!1,this.options.enableMouseEvents&&this.listenerTypes.push(Qi.mouse),this.options.enableTouchEvents&&this.listenerTypes.push(Qi.touch),this.options.enableKeyboardEvents&&this.listenerTypes.push(Qi.keyboard)}}const CF=function(t,n={},r={}){return new Yu(t,n,r)};function Or(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:Vm(e)?2:qm(e)?3:0}function Nl(e,t){return nu(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function kF(e,t){return nu(e)===2?e.get(t):e[t]}function NC(e,t,n){var r=nu(e);r===2?e.set(t,n):r===3?(e.delete(t),e.add(n)):e[t]=n}function FC(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function Vm(e){return TF&&e instanceof Map}function qm(e){return RF&&e instanceof Set}function Co(e){return e.o||e.t}function Gm(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=$C(e);delete t[at];for(var n=Fl(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=_F),Object.freeze(e),t&&Uo(e,function(n,r){return Km(r,!0)},!0)),e}function _F(){Or(2)}function Qm(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function Wr(e){var t=vg[e];return t||Or(18,e),t}function bF(e,t){vg[e]||(vg[e]=t)}function pg(){return ws}function jp(e,t){t&&(Wr("Patches"),e.u=[],e.s=[],e.v=t)}function $c(e){hg(e),e.p.forEach(OF),e.p=null}function hg(e){e===ws&&(ws=e.l)}function _x(e){return ws={p:[],l:ws,h:e,m:!0,_:0}}function OF(e){var t=e[at];t.i===0||t.i===1?t.j():t.O=!0}function Wp(e,t){t._=t.p.length;var n=t.p[0],r=e!==void 0&&e!==n;return t.h.g||Wr("ES5").S(t,e,r),r?(n[at].P&&($c(t),Or(4)),gi(e)&&(e=Bc(t,e),t.l||Uc(t,e)),t.u&&Wr("Patches").M(n[at].t,e,t.u,t.s)):e=Bc(t,n,[]),$c(t),t.u&&t.v(t.u,t.s),e!==zC?e:void 0}function Bc(e,t,n){if(Qm(t))return t;var r=t[at];if(!r)return Uo(t,function(l,s){return bx(e,r,t,l,s,n)},!0),t;if(r.A!==e)return t;if(!r.P)return Uc(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=r.i===4||r.i===5?r.o=Gm(r.k):r.o;Uo(r.i===3?new Set(i):i,function(l,s){return bx(e,r,i,l,s,n)}),Uc(e,i,!1),n&&e.u&&Wr("Patches").R(r,n,e.u,e.s)}return r.o}function bx(e,t,n,r,i,l){if(ro(i)){var s=Bc(e,i,l&&t&&t.i!==3&&!Nl(t.D,r)?l.concat(r):void 0);if(NC(n,r,s),!ro(s))return;e.m=!1}if(gi(i)&&!Qm(i)){if(!e.h.F&&e._<1)return;Bc(e,i),t&&t.A.l||Uc(e,i)}}function Uc(e,t,n){n===void 0&&(n=!1),e.h.F&&e.m&&Km(t,n)}function Vp(e,t){var n=e[at];return(n?Co(n):e)[t]}function Ox(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function Fi(e){e.P||(e.P=!0,e.l&&Fi(e.l))}function qp(e){e.o||(e.o=Gm(e.t))}function gg(e,t,n){var r=Vm(t)?Wr("MapSet").N(t,n):qm(t)?Wr("MapSet").T(t,n):e.g?function(i,l){var s=Array.isArray(i),a={i:s?1:0,A:l?l.A:pg(),P:!1,I:!1,D:{},l,t:i,k:null,o:null,j:null,C:!1},f=a,d=Ss;s&&(f=[a],d=Fu);var h=Proxy.revocable(f,d),g=h.revoke,y=h.proxy;return a.k=y,a.j=g,y}(t,n):Wr("ES5").J(t,n);return(n?n.A:pg()).p.push(r),r}function mg(e){return ro(e)||Or(22,e),function t(n){if(!gi(n))return n;var r,i=n[at],l=nu(n);if(i){if(!i.P&&(i.i<4||!Wr("ES5").K(i)))return i.t;i.I=!0,r=Ix(n,l),i.I=!1}else r=Ix(n,l);return Uo(r,function(s,a){i&&kF(i.t,s)===a||NC(r,s,t(a))}),l===3?new Set(r):r}(e)}function Ix(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return Gm(e)}function IF(){function e(l,s){var a=i[l];return a?a.enumerable=s:i[l]=a={configurable:!0,enumerable:s,get:function(){var f=this[at];return Ss.get(f,l)},set:function(f){var d=this[at];Ss.set(d,l,f)}},a}function t(l){for(var s=l.length-1;s>=0;s--){var a=l[s][at];if(!a.P)switch(a.i){case 5:r(a)&&Fi(a);break;case 4:n(a)&&Fi(a)}}}function n(l){for(var s=l.t,a=l.k,f=Fl(a),d=f.length-1;d>=0;d--){var h=f[d];if(h!==at){var g=s[h];if(g===void 0&&!Nl(s,h))return!0;var y=a[h],m=y&&y[at];if(m?m.t!==g:!FC(y,g))return!0}}var w=!!s[at];return f.length!==Fl(s).length+(w?0:1)}function r(l){var s=l.k;if(s.length!==l.t.length)return!0;var a=Object.getOwnPropertyDescriptor(s,s.length-1);if(a&&!a.get)return!0;for(var f=0;f1?v-1:0),_=1;_1?h-1:0),y=1;y=0;i--){var l=r[i];if(l.path.length===0&&l.op==="replace"){n=l.value;break}}i>-1&&(r=r.slice(i+1));var s=Wr("Patches").$;return ro(n)?s(n,r):this.produce(n,function(a){return s(a,r)})},e}(),Un=new AF,BC=Un.produce;Un.produceWithPatches.bind(Un);Un.setAutoFreeze.bind(Un);Un.setUseProxies.bind(Un);Un.applyPatches.bind(Un);Un.createDraft.bind(Un);Un.finishDraft.bind(Un);function UC(e){var t=function(r){var i=r.dispatch,l=r.getState;return function(s){return function(a){return typeof a=="function"?a(i,l,e):s(a)}}};return t}var HC=UC();HC.withExtraArgument=UC;const Ax=HC;var DF=globalThis&&globalThis.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var l in i)Object.prototype.hasOwnProperty.call(i,l)&&(r[l]=i[l])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),LF=globalThis&&globalThis.__generator||function(e,t){var n={label:0,sent:function(){if(l[0]&1)throw l[1];return l[1]},trys:[],ops:[]},r,i,l,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(d){return function(h){return f([d,h])}}function f(d){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,i&&(l=d[0]&2?i.return:d[0]?i.throw||((l=i.return)&&l.call(i),0):i.next)&&!(l=l.call(i,d[1])).done)return l;switch(i=0,l&&(d=[d[0]&2,l.value]),d[0]){case 0:case 1:l=d;break;case 4:return n.label++,{value:d[1],done:!1};case 5:n.label++,i=d[1],d=[0];continue;case 7:d=n.ops.pop(),n.trys.pop();continue;default:if(l=n.trys,!(l=l.length>0&&l[l.length-1])&&(d[0]===6||d[0]===2)){n=0;continue}if(d[0]===3&&(!l||d[1]>l[0]&&d[1]-1;return n&&r}function tv(e){return typeof e[0]=="function"&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function WC(){for(var e=[],t=0;t(e.PLAYER="player",e.SHOP="shop",e.CONTAINER="container",e.CRAFTING="crafting",e))(en||{}),jc={exports:{}};(function(e,t){(function(){var n,r="4.17.21",i=200,l="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",s="Expected a function",a="Invalid `variable` option passed into `_.template`",f="__lodash_hash_undefined__",d=500,h="__lodash_placeholder__",g=1,y=2,m=4,w=1,E=2,A=1,v=2,S=4,_=8,P=16,D=32,R=64,F=128,z=256,q=512,K=30,B="...",X=800,$=16,H=1,ie=2,oe=3,ue=1/0,U=9007199254740991,J=17976931348623157e292,ee=0/0,b=4294967295,O=b-1,fe=b>>>1,ve=[["ary",F],["bind",A],["bindKey",v],["curry",_],["curryRight",P],["flip",q],["partial",D],["partialRight",R],["rearg",z]],Ae="[object Arguments]",de="[object Array]",Oe="[object AsyncFunction]",ye="[object Boolean]",Fe="[object Date]",Te="[object DOMException]",Ue="[object Error]",$e="[object Function]",We="[object GeneratorFunction]",yt="[object Map]",qn="[object Number]",he="[object Null]",ut="[object Object]",zt="[object Promise]",pn="[object Proxy]",Gn="[object RegExp]",Vt="[object Set]",vr="[object String]",qr="[object Symbol]",Yo="[object Undefined]",Pr="[object WeakMap]",Kn="[object WeakSet]",Qn="[object ArrayBuffer]",W="[object DataView]",re="[object Float32Array]",xe="[object Float64Array]",He="[object Int8Array]",qt="[object Int16Array]",Gr="[object Int32Array]",qe="[object Uint8Array]",St="[object Uint8ClampedArray]",Ar="[object Uint16Array]",Kr="[object Uint32Array]",dt=/\b__p \+= '';/g,lu=/\b(__p \+=) '' \+/g,yr=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Tv=/&(?:amp|lt|gt|quot|#39);/g,Rv=/[&<>"']/g,b_=RegExp(Tv.source),O_=RegExp(Rv.source),I_=/<%-([\s\S]+?)%>/g,T_=/<%([\s\S]+?)%>/g,Pv=/<%=([\s\S]+?)%>/g,R_=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,P_=/^\w*$/,A_=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jf=/[\\^$.*+?()[\]{}|]/g,D_=RegExp(Jf.source),ed=/^\s+/,L_=/\s/,M_=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,N_=/\{\n\/\* \[wrapped with (.+)\] \*/,F_=/,? & /,z_=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,$_=/[()=,{}\[\]\/\s]/,B_=/\\(\\)?/g,U_=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Av=/\w*$/,H_=/^[-+]0x[0-9a-f]+$/i,j_=/^0b[01]+$/i,W_=/^\[object .+?Constructor\]$/,V_=/^0o[0-7]+$/i,q_=/^(?:0|[1-9]\d*)$/,G_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ms=/($^)/,K_=/['\n\r\u2028\u2029\\]/g,Ns="\\ud800-\\udfff",Q_="\\u0300-\\u036f",Y_="\\ufe20-\\ufe2f",X_="\\u20d0-\\u20ff",Dv=Q_+Y_+X_,Lv="\\u2700-\\u27bf",Mv="a-z\\xdf-\\xf6\\xf8-\\xff",Z_="\\xac\\xb1\\xd7\\xf7",J_="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",eb="\\u2000-\\u206f",tb=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Nv="A-Z\\xc0-\\xd6\\xd8-\\xde",Fv="\\ufe0e\\ufe0f",zv=Z_+J_+eb+tb,td="['’]",nb="["+Ns+"]",$v="["+zv+"]",Fs="["+Dv+"]",Bv="\\d+",rb="["+Lv+"]",Uv="["+Mv+"]",Hv="[^"+Ns+zv+Bv+Lv+Mv+Nv+"]",nd="\\ud83c[\\udffb-\\udfff]",ib="(?:"+Fs+"|"+nd+")",jv="[^"+Ns+"]",rd="(?:\\ud83c[\\udde6-\\uddff]){2}",id="[\\ud800-\\udbff][\\udc00-\\udfff]",Xo="["+Nv+"]",Wv="\\u200d",Vv="(?:"+Uv+"|"+Hv+")",ob="(?:"+Xo+"|"+Hv+")",qv="(?:"+td+"(?:d|ll|m|re|s|t|ve))?",Gv="(?:"+td+"(?:D|LL|M|RE|S|T|VE))?",Kv=ib+"?",Qv="["+Fv+"]?",lb="(?:"+Wv+"(?:"+[jv,rd,id].join("|")+")"+Qv+Kv+")*",ub="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",sb="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Yv=Qv+Kv+lb,ab="(?:"+[rb,rd,id].join("|")+")"+Yv,cb="(?:"+[jv+Fs+"?",Fs,rd,id,nb].join("|")+")",fb=RegExp(td,"g"),db=RegExp(Fs,"g"),od=RegExp(nd+"(?="+nd+")|"+cb+Yv,"g"),pb=RegExp([Xo+"?"+Uv+"+"+qv+"(?="+[$v,Xo,"$"].join("|")+")",ob+"+"+Gv+"(?="+[$v,Xo+Vv,"$"].join("|")+")",Xo+"?"+Vv+"+"+qv,Xo+"+"+Gv,sb,ub,Bv,ab].join("|"),"g"),hb=RegExp("["+Wv+Ns+Dv+Fv+"]"),gb=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,mb=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],vb=-1,nt={};nt[re]=nt[xe]=nt[He]=nt[qt]=nt[Gr]=nt[qe]=nt[St]=nt[Ar]=nt[Kr]=!0,nt[Ae]=nt[de]=nt[Qn]=nt[ye]=nt[W]=nt[Fe]=nt[Ue]=nt[$e]=nt[yt]=nt[qn]=nt[ut]=nt[Gn]=nt[Vt]=nt[vr]=nt[Pr]=!1;var et={};et[Ae]=et[de]=et[Qn]=et[W]=et[ye]=et[Fe]=et[re]=et[xe]=et[He]=et[qt]=et[Gr]=et[yt]=et[qn]=et[ut]=et[Gn]=et[Vt]=et[vr]=et[qr]=et[qe]=et[St]=et[Ar]=et[Kr]=!0,et[Ue]=et[$e]=et[Pr]=!1;var yb={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"},xb={"&":"&","<":"<",">":">",'"':""","'":"'"},wb={"&":"&","<":"<",">":">",""":'"',"'":"'"},Sb={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Eb=parseFloat,Cb=parseInt,Xv=typeof Eu=="object"&&Eu&&Eu.Object===Object&&Eu,kb=typeof self=="object"&&self&&self.Object===Object&&self,$t=Xv||kb||Function("return this")(),ld=t&&!t.nodeType&&t,fo=ld&&!0&&e&&!e.nodeType&&e,Zv=fo&&fo.exports===ld,ud=Zv&&Xv.process,Yn=function(){try{var M=fo&&fo.require&&fo.require("util").types;return M||ud&&ud.binding&&ud.binding("util")}catch{}}(),Jv=Yn&&Yn.isArrayBuffer,ey=Yn&&Yn.isDate,ty=Yn&&Yn.isMap,ny=Yn&&Yn.isRegExp,ry=Yn&&Yn.isSet,iy=Yn&&Yn.isTypedArray;function On(M,G,j){switch(j.length){case 0:return M.call(G);case 1:return M.call(G,j[0]);case 2:return M.call(G,j[0],j[1]);case 3:return M.call(G,j[0],j[1],j[2])}return M.apply(G,j)}function _b(M,G,j,se){for(var Ce=-1,je=M==null?0:M.length;++Ce-1}function sd(M,G,j){for(var se=-1,Ce=M==null?0:M.length;++se-1;);return j}function dy(M,G){for(var j=M.length;j--&&Zo(G,M[j],0)>-1;);return j}function Lb(M,G){for(var j=M.length,se=0;j--;)M[j]===G&&++se;return se}var Mb=dd(yb),Nb=dd(xb);function Fb(M){return"\\"+Sb[M]}function zb(M,G){return M==null?n:M[G]}function Jo(M){return hb.test(M)}function $b(M){return gb.test(M)}function Bb(M){for(var G,j=[];!(G=M.next()).done;)j.push(G.value);return j}function md(M){var G=-1,j=Array(M.size);return M.forEach(function(se,Ce){j[++G]=[Ce,se]}),j}function py(M,G){return function(j){return M(G(j))}}function Ci(M,G){for(var j=-1,se=M.length,Ce=0,je=[];++j-1}function OO(o,u){var c=this.__data__,p=ta(c,o);return p<0?(++this.size,c.push([o,u])):c[p][1]=u,this}Qr.prototype.clear=CO,Qr.prototype.delete=kO,Qr.prototype.get=_O,Qr.prototype.has=bO,Qr.prototype.set=OO;function Yr(o){var u=-1,c=o==null?0:o.length;for(this.clear();++u=u?o:u)),o}function er(o,u,c,p,x,k){var I,L=u&g,N=u&y,Q=u&m;if(c&&(I=x?c(o,p,x,k):c(o)),I!==n)return I;if(!pt(o))return o;var Y=ke(o);if(Y){if(I=PI(o),!L)return hn(o,I)}else{var Z=Kt(o),le=Z==$e||Z==We;if(Ti(o))return Qy(o,L);if(Z==ut||Z==Ae||le&&!x){if(I=N||le?{}:h0(o),!L)return N?wI(o,jO(I,o)):xI(o,_y(I,o))}else{if(!et[Z])return x?o:{};I=AI(o,Z,L)}}k||(k=new wr);var ce=k.get(o);if(ce)return ce;k.set(o,I),j0(o)?o.forEach(function(me){I.add(er(me,u,c,me,o,k))}):U0(o)&&o.forEach(function(me,Le){I.set(Le,er(me,u,c,Le,o,k))});var ge=Q?N?Hd:Ud:N?mn:Dt,Re=Y?n:ge(o);return Xn(Re||o,function(me,Le){Re&&(Le=me,me=o[Le]),pu(I,Le,er(me,u,c,Le,o,k))}),I}function WO(o){var u=Dt(o);return function(c){return by(c,o,u)}}function by(o,u,c){var p=c.length;if(o==null)return!p;for(o=Ze(o);p--;){var x=c[p],k=u[x],I=o[x];if(I===n&&!(x in o)||!k(I))return!1}return!0}function Oy(o,u,c){if(typeof o!="function")throw new Zn(s);return wu(function(){o.apply(n,c)},u)}function hu(o,u,c,p){var x=-1,k=zs,I=!0,L=o.length,N=[],Q=u.length;if(!L)return N;c&&(u=st(u,In(c))),p?(k=sd,I=!1):u.length>=i&&(k=uu,I=!1,u=new go(u));e:for(;++xx?0:x+c),p=p===n||p>x?x:Ie(p),p<0&&(p+=x),p=c>p?0:V0(p);c0&&c(L)?u>1?Bt(L,u-1,c,p,x):Ei(x,L):p||(x[x.length]=L)}return x}var Cd=t0(),Ry=t0(!0);function Dr(o,u){return o&&Cd(o,u,Dt)}function kd(o,u){return o&&Ry(o,u,Dt)}function ra(o,u){return Si(u,function(c){return ti(o[c])})}function vo(o,u){u=Oi(u,o);for(var c=0,p=u.length;o!=null&&cu}function GO(o,u){return o!=null&&Ge.call(o,u)}function KO(o,u){return o!=null&&u in Ze(o)}function QO(o,u,c){return o>=Gt(u,c)&&o=120&&Y.length>=120)?new go(I&&Y):n}Y=o[0];var Z=-1,le=L[0];e:for(;++Z-1;)L!==o&&Ks.call(L,N,1),Ks.call(o,N,1);return o}function Uy(o,u){for(var c=o?u.length:0,p=c-1;c--;){var x=u[c];if(c==p||x!==k){var k=x;ei(x)?Ks.call(o,x,1):Ld(o,x)}}return o}function Pd(o,u){return o+Xs(Sy()*(u-o+1))}function sI(o,u,c,p){for(var x=-1,k=Tt(Ys((u-o)/(c||1)),0),I=j(k);k--;)I[p?k:++x]=o,o+=c;return I}function Ad(o,u){var c="";if(!o||u<1||u>U)return c;do u%2&&(c+=o),u=Xs(u/2),u&&(o+=o);while(u);return c}function De(o,u){return Qd(v0(o,u,vn),o+"")}function aI(o){return ky(cl(o))}function cI(o,u){var c=cl(o);return ha(c,mo(u,0,c.length))}function vu(o,u,c,p){if(!pt(o))return o;u=Oi(u,o);for(var x=-1,k=u.length,I=k-1,L=o;L!=null&&++xx?0:x+u),c=c>x?x:c,c<0&&(c+=x),x=u>c?0:c-u>>>0,u>>>=0;for(var k=j(x);++p>>1,I=o[k];I!==null&&!Rn(I)&&(c?I<=u:I=i){var Q=u?null:kI(o);if(Q)return Bs(Q);I=!1,x=uu,N=new go}else N=u?[]:L;e:for(;++p=p?o:tr(o,u,c)}var Ky=tO||function(o){return $t.clearTimeout(o)};function Qy(o,u){if(u)return o.slice();var c=o.length,p=my?my(c):new o.constructor(c);return o.copy(p),p}function zd(o){var u=new o.constructor(o.byteLength);return new qs(u).set(new qs(o)),u}function gI(o,u){var c=u?zd(o.buffer):o.buffer;return new o.constructor(c,o.byteOffset,o.byteLength)}function mI(o){var u=new o.constructor(o.source,Av.exec(o));return u.lastIndex=o.lastIndex,u}function vI(o){return du?Ze(du.call(o)):{}}function Yy(o,u){var c=u?zd(o.buffer):o.buffer;return new o.constructor(c,o.byteOffset,o.length)}function Xy(o,u){if(o!==u){var c=o!==n,p=o===null,x=o===o,k=Rn(o),I=u!==n,L=u===null,N=u===u,Q=Rn(u);if(!L&&!Q&&!k&&o>u||k&&I&&N&&!L&&!Q||p&&I&&N||!c&&N||!x)return 1;if(!p&&!k&&!Q&&o=L)return N;var Q=c[p];return N*(Q=="desc"?-1:1)}}return o.index-u.index}function Zy(o,u,c,p){for(var x=-1,k=o.length,I=c.length,L=-1,N=u.length,Q=Tt(k-I,0),Y=j(N+Q),Z=!p;++L1?c[x-1]:n,I=x>2?c[2]:n;for(k=o.length>3&&typeof k=="function"?(x--,k):n,I&&ln(c[0],c[1],I)&&(k=x<3?n:k,x=1),u=Ze(u);++p-1?x[k?u[I]:I]:n}}function i0(o){return Jr(function(u){var c=u.length,p=c,x=Jn.prototype.thru;for(o&&u.reverse();p--;){var k=u[p];if(typeof k!="function")throw new Zn(s);if(x&&!I&&da(k)=="wrapper")var I=new Jn([],!0)}for(p=I?p:c;++p1&&ze.reverse(),Y&&NL))return!1;var Q=k.get(o),Y=k.get(u);if(Q&&Y)return Q==u&&Y==o;var Z=-1,le=!0,ce=c&E?new go:n;for(k.set(o,u),k.set(u,o);++Z1?"& ":"")+u[p],u=u.join(c>2?", ":" "),o.replace(M_,`{ +/* [wrapped with `+u+`] */ +`)}function LI(o){return ke(o)||wo(o)||!!(xy&&o&&o[xy])}function ei(o,u){var c=typeof o;return u=u??U,!!u&&(c=="number"||c!="symbol"&&q_.test(o))&&o>-1&&o%1==0&&o0){if(++u>=X)return arguments[0]}else u=0;return o.apply(n,arguments)}}function ha(o,u){var c=-1,p=o.length,x=p-1;for(u=u===n?p:u;++c1?o[u-1]:n;return c=typeof c=="function"?(o.pop(),c):n,T0(o,c)});function R0(o){var u=C(o);return u.__chain__=!0,u}function VT(o,u){return u(o),o}function ga(o,u){return u(o)}var qT=Jr(function(o){var u=o.length,c=u?o[0]:0,p=this.__wrapped__,x=function(k){return Ed(k,o)};return u>1||this.__actions__.length||!(p instanceof Me)||!ei(c)?this.thru(x):(p=p.slice(c,+c+(u?1:0)),p.__actions__.push({func:ga,args:[x],thisArg:n}),new Jn(p,this.__chain__).thru(function(k){return u&&!k.length&&k.push(n),k}))});function GT(){return R0(this)}function KT(){return new Jn(this.value(),this.__chain__)}function QT(){this.__values__===n&&(this.__values__=W0(this.value()));var o=this.__index__>=this.__values__.length,u=o?n:this.__values__[this.__index__++];return{done:o,value:u}}function YT(){return this}function XT(o){for(var u,c=this;c instanceof ea;){var p=C0(c);p.__index__=0,p.__values__=n,u?x.__wrapped__=p:u=p;var x=p;c=c.__wrapped__}return x.__wrapped__=o,u}function ZT(){var o=this.__wrapped__;if(o instanceof Me){var u=o;return this.__actions__.length&&(u=new Me(this)),u=u.reverse(),u.__actions__.push({func:ga,args:[Yd],thisArg:n}),new Jn(u,this.__chain__)}return this.thru(Yd)}function JT(){return qy(this.__wrapped__,this.__actions__)}var eR=ua(function(o,u,c){Ge.call(o,c)?++o[c]:Xr(o,c,1)});function tR(o,u,c){var p=ke(o)?oy:VO;return c&&ln(o,u,c)&&(u=n),p(o,pe(u,3))}function nR(o,u){var c=ke(o)?Si:Ty;return c(o,pe(u,3))}var rR=r0(k0),iR=r0(_0);function oR(o,u){return Bt(ma(o,u),1)}function lR(o,u){return Bt(ma(o,u),ue)}function uR(o,u,c){return c=c===n?1:Ie(c),Bt(ma(o,u),c)}function P0(o,u){var c=ke(o)?Xn:_i;return c(o,pe(u,3))}function A0(o,u){var c=ke(o)?bb:Iy;return c(o,pe(u,3))}var sR=ua(function(o,u,c){Ge.call(o,c)?o[c].push(u):Xr(o,c,[u])});function aR(o,u,c,p){o=gn(o)?o:cl(o),c=c&&!p?Ie(c):0;var x=o.length;return c<0&&(c=Tt(x+c,0)),Sa(o)?c<=x&&o.indexOf(u,c)>-1:!!x&&Zo(o,u,c)>-1}var cR=De(function(o,u,c){var p=-1,x=typeof u=="function",k=gn(o)?j(o.length):[];return _i(o,function(I){k[++p]=x?On(u,I,c):gu(I,u,c)}),k}),fR=ua(function(o,u,c){Xr(o,c,u)});function ma(o,u){var c=ke(o)?st:My;return c(o,pe(u,3))}function dR(o,u,c,p){return o==null?[]:(ke(u)||(u=u==null?[]:[u]),c=p?n:c,ke(c)||(c=c==null?[]:[c]),$y(o,u,c))}var pR=ua(function(o,u,c){o[c?0:1].push(u)},function(){return[[],[]]});function hR(o,u,c){var p=ke(o)?ad:ay,x=arguments.length<3;return p(o,pe(u,4),c,x,_i)}function gR(o,u,c){var p=ke(o)?Ob:ay,x=arguments.length<3;return p(o,pe(u,4),c,x,Iy)}function mR(o,u){var c=ke(o)?Si:Ty;return c(o,xa(pe(u,3)))}function vR(o){var u=ke(o)?ky:aI;return u(o)}function yR(o,u,c){(c?ln(o,u,c):u===n)?u=1:u=Ie(u);var p=ke(o)?BO:cI;return p(o,u)}function xR(o){var u=ke(o)?UO:dI;return u(o)}function wR(o){if(o==null)return 0;if(gn(o))return Sa(o)?el(o):o.length;var u=Kt(o);return u==yt||u==Vt?o.size:Id(o).length}function SR(o,u,c){var p=ke(o)?cd:pI;return c&&ln(o,u,c)&&(u=n),p(o,pe(u,3))}var ER=De(function(o,u){if(o==null)return[];var c=u.length;return c>1&&ln(o,u[0],u[1])?u=[]:c>2&&ln(u[0],u[1],u[2])&&(u=[u[0]]),$y(o,Bt(u,1),[])}),va=nO||function(){return $t.Date.now()};function CR(o,u){if(typeof u!="function")throw new Zn(s);return o=Ie(o),function(){if(--o<1)return u.apply(this,arguments)}}function D0(o,u,c){return u=c?n:u,u=o&&u==null?o.length:u,Zr(o,F,n,n,n,n,u)}function L0(o,u){var c;if(typeof u!="function")throw new Zn(s);return o=Ie(o),function(){return--o>0&&(c=u.apply(this,arguments)),o<=1&&(u=n),c}}var Zd=De(function(o,u,c){var p=A;if(c.length){var x=Ci(c,sl(Zd));p|=D}return Zr(o,p,u,c,x)}),M0=De(function(o,u,c){var p=A|v;if(c.length){var x=Ci(c,sl(M0));p|=D}return Zr(u,p,o,c,x)});function N0(o,u,c){u=c?n:u;var p=Zr(o,_,n,n,n,n,n,u);return p.placeholder=N0.placeholder,p}function F0(o,u,c){u=c?n:u;var p=Zr(o,P,n,n,n,n,n,u);return p.placeholder=F0.placeholder,p}function z0(o,u,c){var p,x,k,I,L,N,Q=0,Y=!1,Z=!1,le=!0;if(typeof o!="function")throw new Zn(s);u=rr(u)||0,pt(c)&&(Y=!!c.leading,Z="maxWait"in c,k=Z?Tt(rr(c.maxWait)||0,u):k,le="trailing"in c?!!c.trailing:le);function ce(Ct){var Er=p,ri=x;return p=x=n,Q=Ct,I=o.apply(ri,Er),I}function ge(Ct){return Q=Ct,L=wu(Le,u),Y?ce(Ct):I}function Re(Ct){var Er=Ct-N,ri=Ct-Q,r1=u-Er;return Z?Gt(r1,k-ri):r1}function me(Ct){var Er=Ct-N,ri=Ct-Q;return N===n||Er>=u||Er<0||Z&&ri>=k}function Le(){var Ct=va();if(me(Ct))return ze(Ct);L=wu(Le,Re(Ct))}function ze(Ct){return L=n,le&&p?ce(Ct):(p=x=n,I)}function Pn(){L!==n&&Ky(L),Q=0,p=N=x=L=n}function un(){return L===n?I:ze(va())}function An(){var Ct=va(),Er=me(Ct);if(p=arguments,x=this,N=Ct,Er){if(L===n)return ge(N);if(Z)return Ky(L),L=wu(Le,u),ce(N)}return L===n&&(L=wu(Le,u)),I}return An.cancel=Pn,An.flush=un,An}var kR=De(function(o,u){return Oy(o,1,u)}),_R=De(function(o,u,c){return Oy(o,rr(u)||0,c)});function bR(o){return Zr(o,q)}function ya(o,u){if(typeof o!="function"||u!=null&&typeof u!="function")throw new Zn(s);var c=function(){var p=arguments,x=u?u.apply(this,p):p[0],k=c.cache;if(k.has(x))return k.get(x);var I=o.apply(this,p);return c.cache=k.set(x,I)||k,I};return c.cache=new(ya.Cache||Yr),c}ya.Cache=Yr;function xa(o){if(typeof o!="function")throw new Zn(s);return function(){var u=arguments;switch(u.length){case 0:return!o.call(this);case 1:return!o.call(this,u[0]);case 2:return!o.call(this,u[0],u[1]);case 3:return!o.call(this,u[0],u[1],u[2])}return!o.apply(this,u)}}function OR(o){return L0(2,o)}var IR=hI(function(o,u){u=u.length==1&&ke(u[0])?st(u[0],In(pe())):st(Bt(u,1),In(pe()));var c=u.length;return De(function(p){for(var x=-1,k=Gt(p.length,c);++x=u}),wo=Ay(function(){return arguments}())?Ay:function(o){return xt(o)&&Ge.call(o,"callee")&&!yy.call(o,"callee")},ke=j.isArray,jR=Jv?In(Jv):XO;function gn(o){return o!=null&&wa(o.length)&&!ti(o)}function Et(o){return xt(o)&&gn(o)}function WR(o){return o===!0||o===!1||xt(o)&&on(o)==ye}var Ti=iO||cp,VR=ey?In(ey):ZO;function qR(o){return xt(o)&&o.nodeType===1&&!Su(o)}function GR(o){if(o==null)return!0;if(gn(o)&&(ke(o)||typeof o=="string"||typeof o.splice=="function"||Ti(o)||al(o)||wo(o)))return!o.length;var u=Kt(o);if(u==yt||u==Vt)return!o.size;if(xu(o))return!Id(o).length;for(var c in o)if(Ge.call(o,c))return!1;return!0}function KR(o,u){return mu(o,u)}function QR(o,u,c){c=typeof c=="function"?c:n;var p=c?c(o,u):n;return p===n?mu(o,u,n,c):!!p}function ep(o){if(!xt(o))return!1;var u=on(o);return u==Ue||u==Te||typeof o.message=="string"&&typeof o.name=="string"&&!Su(o)}function YR(o){return typeof o=="number"&&wy(o)}function ti(o){if(!pt(o))return!1;var u=on(o);return u==$e||u==We||u==Oe||u==pn}function B0(o){return typeof o=="number"&&o==Ie(o)}function wa(o){return typeof o=="number"&&o>-1&&o%1==0&&o<=U}function pt(o){var u=typeof o;return o!=null&&(u=="object"||u=="function")}function xt(o){return o!=null&&typeof o=="object"}var U0=ty?In(ty):eI;function XR(o,u){return o===u||Od(o,u,Wd(u))}function ZR(o,u,c){return c=typeof c=="function"?c:n,Od(o,u,Wd(u),c)}function JR(o){return H0(o)&&o!=+o}function eP(o){if(FI(o))throw new Ce(l);return Dy(o)}function tP(o){return o===null}function nP(o){return o==null}function H0(o){return typeof o=="number"||xt(o)&&on(o)==qn}function Su(o){if(!xt(o)||on(o)!=ut)return!1;var u=Gs(o);if(u===null)return!0;var c=Ge.call(u,"constructor")&&u.constructor;return typeof c=="function"&&c instanceof c&&js.call(c)==Zb}var tp=ny?In(ny):tI;function rP(o){return B0(o)&&o>=-U&&o<=U}var j0=ry?In(ry):nI;function Sa(o){return typeof o=="string"||!ke(o)&&xt(o)&&on(o)==vr}function Rn(o){return typeof o=="symbol"||xt(o)&&on(o)==qr}var al=iy?In(iy):rI;function iP(o){return o===n}function oP(o){return xt(o)&&Kt(o)==Pr}function lP(o){return xt(o)&&on(o)==Kn}var uP=fa(Td),sP=fa(function(o,u){return o<=u});function W0(o){if(!o)return[];if(gn(o))return Sa(o)?xr(o):hn(o);if(su&&o[su])return Bb(o[su]());var u=Kt(o),c=u==yt?md:u==Vt?Bs:cl;return c(o)}function ni(o){if(!o)return o===0?o:0;if(o=rr(o),o===ue||o===-ue){var u=o<0?-1:1;return u*J}return o===o?o:0}function Ie(o){var u=ni(o),c=u%1;return u===u?c?u-c:u:0}function V0(o){return o?mo(Ie(o),0,b):0}function rr(o){if(typeof o=="number")return o;if(Rn(o))return ee;if(pt(o)){var u=typeof o.valueOf=="function"?o.valueOf():o;o=pt(u)?u+"":u}if(typeof o!="string")return o===0?o:+o;o=cy(o);var c=j_.test(o);return c||V_.test(o)?Cb(o.slice(2),c?2:8):H_.test(o)?ee:+o}function q0(o){return Lr(o,mn(o))}function aP(o){return o?mo(Ie(o),-U,U):o===0?o:0}function Ve(o){return o==null?"":Tn(o)}var cP=ll(function(o,u){if(xu(u)||gn(u)){Lr(u,Dt(u),o);return}for(var c in u)Ge.call(u,c)&&pu(o,c,u[c])}),G0=ll(function(o,u){Lr(u,mn(u),o)}),Ea=ll(function(o,u,c,p){Lr(u,mn(u),o,p)}),fP=ll(function(o,u,c,p){Lr(u,Dt(u),o,p)}),dP=Jr(Ed);function pP(o,u){var c=ol(o);return u==null?c:_y(c,u)}var hP=De(function(o,u){o=Ze(o);var c=-1,p=u.length,x=p>2?u[2]:n;for(x&&ln(u[0],u[1],x)&&(p=1);++c1),k}),Lr(o,Hd(o),c),p&&(c=er(c,g|y|m,_I));for(var x=u.length;x--;)Ld(c,u[x]);return c});function AP(o,u){return Q0(o,xa(pe(u)))}var DP=Jr(function(o,u){return o==null?{}:lI(o,u)});function Q0(o,u){if(o==null)return{};var c=st(Hd(o),function(p){return[p]});return u=pe(u),By(o,c,function(p,x){return u(p,x[0])})}function LP(o,u,c){u=Oi(u,o);var p=-1,x=u.length;for(x||(x=1,o=n);++pu){var p=o;o=u,u=p}if(c||o%1||u%1){var x=Sy();return Gt(o+x*(u-o+Eb("1e-"+((x+"").length-1))),u)}return Pd(o,u)}var VP=ul(function(o,u,c){return u=u.toLowerCase(),o+(c?Z0(u):u)});function Z0(o){return ip(Ve(o).toLowerCase())}function J0(o){return o=Ve(o),o&&o.replace(G_,Mb).replace(db,"")}function qP(o,u,c){o=Ve(o),u=Tn(u);var p=o.length;c=c===n?p:mo(Ie(c),0,p);var x=c;return c-=u.length,c>=0&&o.slice(c,x)==u}function GP(o){return o=Ve(o),o&&O_.test(o)?o.replace(Rv,Nb):o}function KP(o){return o=Ve(o),o&&D_.test(o)?o.replace(Jf,"\\$&"):o}var QP=ul(function(o,u,c){return o+(c?"-":"")+u.toLowerCase()}),YP=ul(function(o,u,c){return o+(c?" ":"")+u.toLowerCase()}),XP=n0("toLowerCase");function ZP(o,u,c){o=Ve(o),u=Ie(u);var p=u?el(o):0;if(!u||p>=u)return o;var x=(u-p)/2;return ca(Xs(x),c)+o+ca(Ys(x),c)}function JP(o,u,c){o=Ve(o),u=Ie(u);var p=u?el(o):0;return u&&p>>0,c?(o=Ve(o),o&&(typeof u=="string"||u!=null&&!tp(u))&&(u=Tn(u),!u&&Jo(o))?Ii(xr(o),0,c):o.split(u,c)):[]}var l2=ul(function(o,u,c){return o+(c?" ":"")+ip(u)});function u2(o,u,c){return o=Ve(o),c=c==null?0:mo(Ie(c),0,o.length),u=Tn(u),o.slice(c,c+u.length)==u}function s2(o,u,c){var p=C.templateSettings;c&&ln(o,u,c)&&(u=n),o=Ve(o),u=Ea({},u,p,a0);var x=Ea({},u.imports,p.imports,a0),k=Dt(x),I=gd(x,k),L,N,Q=0,Y=u.interpolate||Ms,Z="__p += '",le=vd((u.escape||Ms).source+"|"+Y.source+"|"+(Y===Pv?U_:Ms).source+"|"+(u.evaluate||Ms).source+"|$","g"),ce="//# sourceURL="+(Ge.call(u,"sourceURL")?(u.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++vb+"]")+` +`;o.replace(le,function(me,Le,ze,Pn,un,An){return ze||(ze=Pn),Z+=o.slice(Q,An).replace(K_,Fb),Le&&(L=!0,Z+=`' + +__e(`+Le+`) + +'`),un&&(N=!0,Z+=`'; +`+un+`; +__p += '`),ze&&(Z+=`' + +((__t = (`+ze+`)) == null ? '' : __t) + +'`),Q=An+me.length,me}),Z+=`'; +`;var ge=Ge.call(u,"variable")&&u.variable;if(!ge)Z=`with (obj) { +`+Z+` +} +`;else if($_.test(ge))throw new Ce(a);Z=(N?Z.replace(dt,""):Z).replace(lu,"$1").replace(yr,"$1;"),Z="function("+(ge||"obj")+`) { +`+(ge?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(L?", __e = _.escape":"")+(N?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+Z+`return __p +}`;var Re=t1(function(){return je(k,ce+"return "+Z).apply(n,I)});if(Re.source=Z,ep(Re))throw Re;return Re}function a2(o){return Ve(o).toLowerCase()}function c2(o){return Ve(o).toUpperCase()}function f2(o,u,c){if(o=Ve(o),o&&(c||u===n))return cy(o);if(!o||!(u=Tn(u)))return o;var p=xr(o),x=xr(u),k=fy(p,x),I=dy(p,x)+1;return Ii(p,k,I).join("")}function d2(o,u,c){if(o=Ve(o),o&&(c||u===n))return o.slice(0,hy(o)+1);if(!o||!(u=Tn(u)))return o;var p=xr(o),x=dy(p,xr(u))+1;return Ii(p,0,x).join("")}function p2(o,u,c){if(o=Ve(o),o&&(c||u===n))return o.replace(ed,"");if(!o||!(u=Tn(u)))return o;var p=xr(o),x=fy(p,xr(u));return Ii(p,x).join("")}function h2(o,u){var c=K,p=B;if(pt(u)){var x="separator"in u?u.separator:x;c="length"in u?Ie(u.length):c,p="omission"in u?Tn(u.omission):p}o=Ve(o);var k=o.length;if(Jo(o)){var I=xr(o);k=I.length}if(c>=k)return o;var L=c-el(p);if(L<1)return p;var N=I?Ii(I,0,L).join(""):o.slice(0,L);if(x===n)return N+p;if(I&&(L+=N.length-L),tp(x)){if(o.slice(L).search(x)){var Q,Y=N;for(x.global||(x=vd(x.source,Ve(Av.exec(x))+"g")),x.lastIndex=0;Q=x.exec(Y);)var Z=Q.index;N=N.slice(0,Z===n?L:Z)}}else if(o.indexOf(Tn(x),L)!=L){var le=N.lastIndexOf(x);le>-1&&(N=N.slice(0,le))}return N+p}function g2(o){return o=Ve(o),o&&b_.test(o)?o.replace(Tv,Wb):o}var m2=ul(function(o,u,c){return o+(c?" ":"")+u.toUpperCase()}),ip=n0("toUpperCase");function e1(o,u,c){return o=Ve(o),u=c?n:u,u===n?$b(o)?Gb(o):Rb(o):o.match(u)||[]}var t1=De(function(o,u){try{return On(o,n,u)}catch(c){return ep(c)?c:new Ce(c)}}),v2=Jr(function(o,u){return Xn(u,function(c){c=Mr(c),Xr(o,c,Zd(o[c],o))}),o});function y2(o){var u=o==null?0:o.length,c=pe();return o=u?st(o,function(p){if(typeof p[1]!="function")throw new Zn(s);return[c(p[0]),p[1]]}):[],De(function(p){for(var x=-1;++xU)return[];var c=b,p=Gt(o,b);u=pe(u),o-=b;for(var x=hd(p,u);++c0||u<0)?new Me(c):(o<0?c=c.takeRight(-o):o&&(c=c.drop(o)),u!==n&&(u=Ie(u),c=u<0?c.dropRight(-u):c.take(u-o)),c)},Me.prototype.takeRightWhile=function(o){return this.reverse().takeWhile(o).reverse()},Me.prototype.toArray=function(){return this.take(b)},Dr(Me.prototype,function(o,u){var c=/^(?:filter|find|map|reject)|While$/.test(u),p=/^(?:head|last)$/.test(u),x=C[p?"take"+(u=="last"?"Right":""):u],k=p||/^find/.test(u);!x||(C.prototype[u]=function(){var I=this.__wrapped__,L=p?[1]:arguments,N=I instanceof Me,Q=L[0],Y=N||ke(I),Z=function(Le){var ze=x.apply(C,Ei([Le],L));return p&&le?ze[0]:ze};Y&&c&&typeof Q=="function"&&Q.length!=1&&(N=Y=!1);var le=this.__chain__,ce=!!this.__actions__.length,ge=k&&!le,Re=N&&!ce;if(!k&&Y){I=Re?I:new Me(this);var me=o.apply(I,L);return me.__actions__.push({func:ga,args:[Z],thisArg:n}),new Jn(me,le)}return ge&&Re?o.apply(this,L):(me=this.thru(Z),ge?p?me.value()[0]:me.value():me)})}),Xn(["pop","push","shift","sort","splice","unshift"],function(o){var u=Us[o],c=/^(?:push|sort|unshift)$/.test(o)?"tap":"thru",p=/^(?:pop|shift)$/.test(o);C.prototype[o]=function(){var x=arguments;if(p&&!this.__chain__){var k=this.value();return u.apply(ke(k)?k:[],x)}return this[c](function(I){return u.apply(ke(I)?I:[],x)})}}),Dr(Me.prototype,function(o,u){var c=C[u];if(c){var p=c.name+"";Ge.call(il,p)||(il[p]=[]),il[p].push({name:u,func:c})}}),il[sa(n,v).name]=[{name:"wrapper",func:n}],Me.prototype.clone=gO,Me.prototype.reverse=mO,Me.prototype.value=vO,C.prototype.at=qT,C.prototype.chain=GT,C.prototype.commit=KT,C.prototype.next=QT,C.prototype.plant=XT,C.prototype.reverse=ZT,C.prototype.toJSON=C.prototype.valueOf=C.prototype.value=JT,C.prototype.first=C.prototype.head,su&&(C.prototype[su]=YT),C},tl=Kb();fo?((fo.exports=tl)._=tl,ld._=tl):$t._=tl}).call(Eu)})(jc,jc.exports);const ct={water:{name:"water",close:!1,label:"VODA",stack:!0,usable:!0,count:0},burger:{name:"burger",close:!1,label:"BURGR",stack:!1,usable:!1,count:0}};let lc="images";function l3(e){e&&e!==""&&(lc=e)}const GC=()=>!window.invokeNative,KC=()=>{},u3=window.GetParentResourceName?window.GetParentResourceName():"ox_inventory";async function cr(e,t){if(!GC())try{return await(await fetch(`https://${u3}/${e}`,{method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(t)})).json()}catch(n){throw Error(`Failed to fetch NUI callback ${e}! (${n})`)}}const Fx=(e,t)=>{if(t.type!=="shop"||!wn(e))return!0;if(e.count!==void 0&&e.count===0)return!1;if(e.grade===void 0||!t.groups)return!0;const n=Mn.getState().inventory.leftInventory;if(!n.groups)return!1;const r=Object.keys(t.groups);if(Array.isArray(e.grade)){for(let i=0;i=e.grade)return!0}return!1}},zx=(e,t)=>{if(!wn(e)||t!=="crafting"||!e.ingredients)return!0;const n=Mn.getState().inventory.leftInventory;return Object.entries(e.ingredients).filter(l=>{const[s,a]=[l[0],l[1]],f=ct[s];return a>=1&&f&&f.count>=a?!1:!n.items.find(h=>{if(wn(h)&&h.name===s&&a<1)return h.metadata?.durability>=a*100})}).length===0},wn=(e,t=!1)=>e.name!==void 0&&e.weight!==void 0||t&&e.name!==void 0&&e.count!==void 0&&e.weight!==void 0,s3=(e,t)=>e.name===t.name&&jc.exports.isEqual(e.metadata,t.metadata),a3=(e,t,n)=>t.stack?n.find(i=>i.name===e.name&&jc.exports.isEqual(i.metadata,e.metadata))||n.find(i=>i.name===void 0):n.find(i=>i.name===void 0),Wf=(e,t,n)=>({sourceInventory:t===en.PLAYER?e.leftInventory:e.rightInventory,targetInventory:n?n===en.PLAYER?e.leftInventory:e.rightInventory:t===en.PLAYER?e.rightInventory:e.leftInventory}),Yl=(e,t)=>{if(e?.durability===void 0)return;let n=e.durability;return n>100&&e.degrade&&(n=(e.durability-t)/(60*e.degrade)*100),n<0&&(n=0),n},c3=e=>e.reduce((t,n)=>wn(n)?t+n.weight:t,0),$x=async e=>{const t=await cr("getItemData",e);if(t?.name)return ct[e]=t,t},zl=e=>{const t=typeof e=="object";if(t){if(!e.name)return;const i=e.metadata;if(i?.imageurl)return`${i.imageurl}`;if(i?.image)return`${lc}/${i.image}.png`}const n=t?e.name:e,r=ct[n];return r?(r.image||(r.image=`${lc}/${n}.png`),r.image):`${lc}/${n}.png`},f3=(e,t)=>{const{leftInventory:n,rightInventory:r}=t.payload,i=Math.floor(Date.now()/1e3);n&&(e.leftInventory={...n,items:Array.from(Array(n.slots),(l,s)=>{const a=Object.values(n.items).find(f=>f?.slot===s+1)||{slot:s+1};return a.name&&(typeof ct[a.name]>"u"&&$x(a.name),a.durability=Yl(a.metadata,i)),a})}),r&&(e.rightInventory={...r,items:Array.from(Array(r.slots),(l,s)=>{const a=Object.values(r.items).find(f=>f?.slot===s+1)||{slot:s+1};return a.name&&(typeof ct[a.name]>"u"&&$x(a.name),a.durability=Yl(a.metadata,i)),a})}),e.isBusy=!1},d3=(e,t)=>{if(t.payload.items){Array.isArray(t.payload.items)||(t.payload.items=[t.payload.items]);const n=Math.floor(Date.now()/1e3);Object.values(t.payload.items).filter(r=>!!r).forEach(r=>{const i=r.inventory&&r.inventory!==en.PLAYER?e.rightInventory:e.leftInventory;r.item.durability=Yl(r.item.metadata,n),i.items[r.item.slot-1]=r.item}),e.rightInventory.type===en.CRAFTING&&(e.rightInventory={...e.rightInventory})}if(t.payload.itemCount){const n=Object.entries(t.payload.itemCount);for(let r=0;r{const{fromSlot:n,fromType:r,toSlot:i,toType:l}=t.payload,{sourceInventory:s,targetInventory:a}=Wf(e,r,l),f=Math.floor(Date.now()/1e3);[s.items[n.slot-1],a.items[i.slot-1]]=[{...a.items[i.slot-1],slot:n.slot,durability:Yl(i.metadata,f)},{...s.items[n.slot-1],slot:i.slot,durability:Yl(n.metadata,f)}]},h3=(e,t)=>{const{fromSlot:n,fromType:r,toSlot:i,toType:l,count:s}=t.payload,{sourceInventory:a,targetInventory:f}=Wf(e,r,l),d=n.weight/n.count;f.items[i.slot-1]={...f.items[i.slot-1],count:i.count+s,weight:d*(i.count+s)},!(r===en.SHOP||r===en.CRAFTING)&&(a.items[n.slot-1]=n.count-s>0?{...a.items[n.slot-1],count:n.count-s,weight:d*(n.count-s)}:{slot:n.slot})},g3=(e,t)=>{const{fromSlot:n,fromType:r,toSlot:i,toType:l,count:s}=t.payload,{sourceInventory:a,targetInventory:f}=Wf(e,r,l),d=n.weight/n.count,h=Math.floor(Date.now()/1e3),g=a.items[n.slot-1];f.items[i.slot-1]={...g,count:s,weight:d*s,slot:i.slot,durability:Yl(g.metadata,h)},!(r===en.SHOP||r===en.CRAFTING)&&(a.items[n.slot-1]=n.count-s>0?{...a.items[n.slot-1],count:n.count-s,weight:d*(n.count-s)}:{slot:n.slot})},m3={leftInventory:{id:"",type:"",slots:0,maxWeight:0,items:[]},rightInventory:{id:"",type:"",slots:0,maxWeight:0,items:[]},additionalMetadata:new Array,itemAmount:0,shiftPressed:!1,isBusy:!1},rv=Xm({name:"inventory",initialState:m3,reducers:{stackSlots:h3,swapSlots:p3,setupInventory:f3,moveSlots:g3,refreshSlots:d3,setAdditionalMetadata:(e,t)=>{const n=[];for(let r=0;rl.value===i.value)||n.push(i)}e.additionalMetadata=[...e.additionalMetadata,...n]},setItemAmount:(e,t)=>{e.itemAmount=t.payload},setShiftPressed:(e,t)=>{e.shiftPressed=t.payload},setContainerWeight:(e,t)=>{const n=e.leftInventory.items.find(r=>r.metadata?.container===e.rightInventory.id);!n||(n.weight=t.payload)}},extraReducers:e=>{e.addMatcher(WC,t=>{t.isBusy=!0,t.history={leftInventory:mg(t.leftInventory),rightInventory:mg(t.rightInventory)}}),e.addMatcher(qC,t=>{t.isBusy=!1}),e.addMatcher(VC,t=>{t.history&&t.history.leftInventory&&t.history.rightInventory&&(t.leftInventory=t.history.leftInventory,t.rightInventory=t.history.rightInventory),t.isBusy=!1})}}),{setAdditionalMetadata:v3,setItemAmount:y3,setShiftPressed:x3,setupInventory:QC,swapSlots:w3,moveSlots:S3,stackSlots:E3,refreshSlots:C3,setContainerWeight:k3}=rv.actions,YC=e=>e.inventory.leftInventory,_3=e=>e.inventory.rightInventory,b3=e=>e.inventory.itemAmount,O3=rv.reducer,I3={open:!1,item:null,inventoryType:null},XC=Xm({name:"tooltip",initialState:I3,reducers:{openTooltip(e,t){e.open=!0,e.item=t.payload.item,e.inventoryType=t.payload.inventoryType},closeTooltip(e){e.open=!1}}}),{openTooltip:T3,closeTooltip:Xu}=XC.actions,R3=XC.reducer,P3={coords:null,item:null},ZC=Xm({name:"contextMenu",initialState:P3,reducers:{openContextMenu(e,t){e.coords=t.payload.coords,e.item=t.payload.item},closeContextMenu(e){e.coords=null}}}),{openContextMenu:A3,closeContextMenu:JC}=ZC.actions,D3=ZC.reducer,Mn=KF({reducer:{inventory:O3,tooltip:R3,contextMenu:D3}}),ru=()=>hM(),yi=YL,Br=(e,t)=>{const n=T.exports.useRef(KC);T.exports.useEffect(()=>{n.current=t},[t]),T.exports.useEffect(()=>{const r=i=>{const{action:l,data:s}=i.data;n.current&&l===e&&n.current(s)};return window.addEventListener("message",r),()=>window.removeEventListener("message",r)},[e])},iv=e=>{cr("useItem",e.slot)},ek=e=>{const{inventory:{itemAmount:t}}=Mn.getState();cr("giveItem",{slot:e.slot,count:t})},ot={},Wc=Math.min,Do=Math.max,Vc=Math.round,Tl=Math.floor,io=e=>({x:e,y:e}),L3={left:"right",right:"left",bottom:"top",top:"bottom"},M3={start:"end",end:"start"};function Bx(e,t,n){return Do(e,Wc(t,n))}function Vf(e,t){return typeof e=="function"?e(t):e}function Ho(e){return e.split("-")[0]}function qf(e){return e.split("-")[1]}function tk(e){return e==="x"?"y":"x"}function nk(e){return e==="y"?"height":"width"}function Gf(e){return["top","bottom"].includes(Ho(e))?"y":"x"}function rk(e){return tk(Gf(e))}function N3(e,t,n){n===void 0&&(n=!1);const r=qf(e),i=rk(e),l=nk(i);let s=i==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[l]>t.floating[l]&&(s=qc(s)),[s,qc(s)]}function F3(e){const t=qc(e);return[xg(e),t,xg(t)]}function xg(e){return e.replace(/start|end/g,t=>M3[t])}function z3(e,t,n){const r=["left","right"],i=["right","left"],l=["top","bottom"],s=["bottom","top"];switch(e){case"top":case"bottom":return n?t?i:r:t?r:i;case"left":case"right":return t?l:s;default:return[]}}function $3(e,t,n,r){const i=qf(e);let l=z3(Ho(e),n==="start",r);return i&&(l=l.map(s=>s+"-"+i),t&&(l=l.concat(l.map(xg)))),l}function qc(e){return e.replace(/left|right|bottom|top/g,t=>L3[t])}function B3(e){return{top:0,right:0,bottom:0,left:0,...e}}function U3(e){return typeof e!="number"?B3(e):{top:e,right:e,bottom:e,left:e}}function Gc(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function oo(e){return ik(e)?(e.nodeName||"").toLowerCase():"#document"}function $n(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function xi(e){var t;return(t=(ik(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function ik(e){return e instanceof Node||e instanceof $n(e).Node}function gt(e){return e instanceof Element||e instanceof $n(e).Element}function nn(e){return e instanceof HTMLElement||e instanceof $n(e).HTMLElement}function wg(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof $n(e).ShadowRoot}function Ts(e){const{overflow:t,overflowX:n,overflowY:r,display:i}=Hn(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(i)}function H3(e){return["table","td","th"].includes(oo(e))}function ov(e){const t=lv(),n=Hn(e);return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function j3(e){let t=jo(e);for(;nn(t)&&!Rs(t);){if(ov(t))return t;t=jo(t)}return null}function lv(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function Rs(e){return["html","body","#document"].includes(oo(e))}function Hn(e){return $n(e).getComputedStyle(e)}function Kf(e){return gt(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function jo(e){if(oo(e)==="html")return e;const t=e.assignedSlot||e.parentNode||wg(e)&&e.host||xi(e);return wg(t)?t.host:t}function ok(e){const t=jo(e);return Rs(t)?e.ownerDocument?e.ownerDocument.body:e.body:nn(t)&&Ts(t)?t:ok(t)}function Zi(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const i=ok(e),l=i===((r=e.ownerDocument)==null?void 0:r.body),s=$n(i);return l?t.concat(s,s.visualViewport||[],Ts(i)?i:[],s.frameElement&&n?Zi(s.frameElement):[]):t.concat(i,Zi(i,[],n))}function zi(e){let t=e.activeElement;for(;((n=t)==null||(r=n.shadowRoot)==null?void 0:r.activeElement)!=null;){var n,r;t=t.shadowRoot.activeElement}return t}function Lt(e,t){if(!e||!t)return!1;const n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&wg(n)){let r=t;for(;r;){if(e===r)return!0;r=r.parentNode||r.host}}return!1}function uv(){const e=navigator.userAgentData;return e!=null&&e.platform?e.platform:navigator.platform}function W3(){const e=navigator.userAgentData;return e&&Array.isArray(e.brands)?e.brands.map(t=>{let{brand:n,version:r}=t;return n+"/"+r}).join(" "):navigator.userAgent}function lk(e){if(e.mozInputSource===0&&e.isTrusted)return!0;const t=/Android/i;return(t.test(uv())||t.test(W3()))&&e.pointerType?e.type==="click"&&e.buttons===1:e.detail===0&&!e.pointerType}function uk(e){return e.width===0&&e.height===0||e.width===1&&e.height===1&&e.pressure===0&&e.detail===0&&e.pointerType!=="mouse"||e.width<1&&e.height<1&&e.pressure===0&&e.detail===0}function sk(){return/apple/i.test(navigator.vendor)}function V3(){return uv().toLowerCase().startsWith("mac")&&!navigator.maxTouchPoints}function Kc(e,t){const n=["mouse","pen"];return t||n.push("",void 0),n.includes(e)}function q3(e){return"nativeEvent"in e}function G3(e){return e.matches("html,body")}function an(e){return e?.ownerDocument||document}function Qp(e,t){if(t==null)return!1;if("composedPath"in e)return e.composedPath().includes(t);const n=e;return n.target!=null&&t.contains(n.target)}function sv(e){return"composedPath"in e?e.composedPath()[0]:e.target}const K3="input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])";function ak(e){return nn(e)&&e.matches(K3)}function Ht(e){e.preventDefault(),e.stopPropagation()}function Ux(e,t,n){let{reference:r,floating:i}=e;const l=Gf(t),s=rk(t),a=nk(s),f=Ho(t),d=l==="y",h=r.x+r.width/2-i.width/2,g=r.y+r.height/2-i.height/2,y=r[a]/2-i[a]/2;let m;switch(f){case"top":m={x:h,y:r.y-i.height};break;case"bottom":m={x:h,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:g};break;case"left":m={x:r.x-i.width,y:g};break;default:m={x:r.x,y:r.y}}switch(qf(t)){case"start":m[s]-=y*(n&&d?-1:1);break;case"end":m[s]+=y*(n&&d?-1:1);break}return m}const Q3=async(e,t,n)=>{const{placement:r="bottom",strategy:i="absolute",middleware:l=[],platform:s}=n,a=l.filter(Boolean),f=await(s.isRTL==null?void 0:s.isRTL(t));let d=await s.getElementRects({reference:e,floating:t,strategy:i}),{x:h,y:g}=Ux(d,r,f),y=r,m={},w=0;for(let E=0;EX<=0)){var q,K;const X=(((q=l.flip)==null?void 0:q.index)||0)+1,$=D[X];if($)return{data:{index:X,overflows:z},reset:{placement:$}};let H=(K=z.filter(ie=>ie.overflows[0]<=0).sort((ie,oe)=>ie.overflows[1]-oe.overflows[1])[0])==null?void 0:K.placement;if(!H)switch(m){case"bestFit":{var B;const ie=(B=z.map(oe=>[oe.placement,oe.overflows.filter(ue=>ue>0).reduce((ue,U)=>ue+U,0)]).sort((oe,ue)=>oe[1]-ue[1])[0])==null?void 0:B[0];ie&&(H=ie);break}case"initialPlacement":H=a;break}if(i!==H)return{reset:{placement:H}}}return{}}}};async function Y3(e,t){const{placement:n,platform:r,elements:i}=e,l=await(r.isRTL==null?void 0:r.isRTL(i.floating)),s=Ho(n),a=qf(n),f=Gf(n)==="y",d=["left","top"].includes(s)?-1:1,h=l&&f?-1:1,g=Vf(t,e);let{mainAxis:y,crossAxis:m,alignmentAxis:w}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...g};return a&&typeof w=="number"&&(m=a==="end"?w*-1:w),f?{x:m*h,y:y*d}:{x:y*d,y:m*h}}const dk=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,i=await Y3(t,e);return{x:n+i.x,y:r+i.y,data:i}}}},pk=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:i}=t,{mainAxis:l=!0,crossAxis:s=!1,limiter:a={fn:A=>{let{x:v,y:S}=A;return{x:v,y:S}}},...f}=Vf(e,t),d={x:n,y:r},h=await ck(t,f),g=Gf(Ho(i)),y=tk(g);let m=d[y],w=d[g];if(l){const A=y==="y"?"top":"left",v=y==="y"?"bottom":"right",S=m+h[A],_=m-h[v];m=Bx(S,m,_)}if(s){const A=g==="y"?"top":"left",v=g==="y"?"bottom":"right",S=w+h[A],_=w-h[v];w=Bx(S,w,_)}const E=a.fn({...t,[y]:m,[g]:w});return{...E,data:{x:E.x-n,y:E.y-r}}}}};function hk(e){const t=Hn(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const i=nn(e),l=i?e.offsetWidth:n,s=i?e.offsetHeight:r,a=Vc(n)!==l||Vc(r)!==s;return a&&(n=l,r=s),{width:n,height:r,$:a}}function av(e){return gt(e)?e:e.contextElement}function $l(e){const t=av(e);if(!nn(t))return io(1);const n=t.getBoundingClientRect(),{width:r,height:i,$:l}=hk(t);let s=(l?Vc(n.width):n.width)/r,a=(l?Vc(n.height):n.height)/i;return(!s||!Number.isFinite(s))&&(s=1),(!a||!Number.isFinite(a))&&(a=1),{x:s,y:a}}const X3=io(0);function gk(e){const t=$n(e);return!lv()||!t.visualViewport?X3:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Z3(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==$n(e)?!1:t}function Wo(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const i=e.getBoundingClientRect(),l=av(e);let s=io(1);t&&(r?gt(r)&&(s=$l(r)):s=$l(e));const a=Z3(l,n,r)?gk(l):io(0);let f=(i.left+a.x)/s.x,d=(i.top+a.y)/s.y,h=i.width/s.x,g=i.height/s.y;if(l){const y=$n(l),m=r&>(r)?$n(r):r;let w=y.frameElement;for(;w&&r&&m!==y;){const E=$l(w),A=w.getBoundingClientRect(),v=Hn(w),S=A.left+(w.clientLeft+parseFloat(v.paddingLeft))*E.x,_=A.top+(w.clientTop+parseFloat(v.paddingTop))*E.y;f*=E.x,d*=E.y,h*=E.x,g*=E.y,f+=S,d+=_,w=$n(w).frameElement}}return Gc({width:h,height:g,x:f,y:d})}function J3(e){let{rect:t,offsetParent:n,strategy:r}=e;const i=nn(n),l=xi(n);if(n===l)return t;let s={scrollLeft:0,scrollTop:0},a=io(1);const f=io(0);if((i||!i&&r!=="fixed")&&((oo(n)!=="body"||Ts(l))&&(s=Kf(n)),nn(n))){const d=Wo(n);a=$l(n),f.x=d.x+n.clientLeft,f.y=d.y+n.clientTop}return{width:t.width*a.x,height:t.height*a.y,x:t.x*a.x-s.scrollLeft*a.x+f.x,y:t.y*a.y-s.scrollTop*a.y+f.y}}function e4(e){return Array.from(e.getClientRects())}function mk(e){return Wo(xi(e)).left+Kf(e).scrollLeft}function t4(e){const t=xi(e),n=Kf(e),r=e.ownerDocument.body,i=Do(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),l=Do(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let s=-n.scrollLeft+mk(e);const a=-n.scrollTop;return Hn(r).direction==="rtl"&&(s+=Do(t.clientWidth,r.clientWidth)-i),{width:i,height:l,x:s,y:a}}function n4(e,t){const n=$n(e),r=xi(e),i=n.visualViewport;let l=r.clientWidth,s=r.clientHeight,a=0,f=0;if(i){l=i.width,s=i.height;const d=lv();(!d||d&&t==="fixed")&&(a=i.offsetLeft,f=i.offsetTop)}return{width:l,height:s,x:a,y:f}}function r4(e,t){const n=Wo(e,!0,t==="fixed"),r=n.top+e.clientTop,i=n.left+e.clientLeft,l=nn(e)?$l(e):io(1),s=e.clientWidth*l.x,a=e.clientHeight*l.y,f=i*l.x,d=r*l.y;return{width:s,height:a,x:f,y:d}}function Hx(e,t,n){let r;if(t==="viewport")r=n4(e,n);else if(t==="document")r=t4(xi(e));else if(gt(t))r=r4(t,n);else{const i=gk(e);r={...t,x:t.x-i.x,y:t.y-i.y}}return Gc(r)}function vk(e,t){const n=jo(e);return n===t||!gt(n)||Rs(n)?!1:Hn(n).position==="fixed"||vk(n,t)}function i4(e,t){const n=t.get(e);if(n)return n;let r=Zi(e,[],!1).filter(a=>gt(a)&&oo(a)!=="body"),i=null;const l=Hn(e).position==="fixed";let s=l?jo(e):e;for(;gt(s)&&!Rs(s);){const a=Hn(s),f=ov(s);!f&&a.position==="fixed"&&(i=null),(l?!f&&!i:!f&&a.position==="static"&&!!i&&["absolute","fixed"].includes(i.position)||Ts(s)&&!f&&vk(e,s))?r=r.filter(h=>h!==s):i=a,s=jo(s)}return t.set(e,r),r}function o4(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e;const s=[...n==="clippingAncestors"?i4(t,this._c):[].concat(n),r],a=s[0],f=s.reduce((d,h)=>{const g=Hx(t,h,i);return d.top=Do(g.top,d.top),d.right=Wc(g.right,d.right),d.bottom=Wc(g.bottom,d.bottom),d.left=Do(g.left,d.left),d},Hx(t,a,i));return{width:f.right-f.left,height:f.bottom-f.top,x:f.left,y:f.top}}function l4(e){return hk(e)}function u4(e,t,n){const r=nn(t),i=xi(t),l=n==="fixed",s=Wo(e,!0,l,t);let a={scrollLeft:0,scrollTop:0};const f=io(0);if(r||!r&&!l)if((oo(t)!=="body"||Ts(i))&&(a=Kf(t)),r){const d=Wo(t,!0,l,t);f.x=d.x+t.clientLeft,f.y=d.y+t.clientTop}else i&&(f.x=mk(i));return{x:s.left+a.scrollLeft-f.x,y:s.top+a.scrollTop-f.y,width:s.width,height:s.height}}function jx(e,t){return!nn(e)||Hn(e).position==="fixed"?null:t?t(e):e.offsetParent}function yk(e,t){const n=$n(e);if(!nn(e))return n;let r=jx(e,t);for(;r&&H3(r)&&Hn(r).position==="static";)r=jx(r,t);return r&&(oo(r)==="html"||oo(r)==="body"&&Hn(r).position==="static"&&!ov(r))?n:r||j3(e)||n}const s4=async function(e){let{reference:t,floating:n,strategy:r}=e;const i=this.getOffsetParent||yk,l=this.getDimensions;return{reference:u4(t,await i(n),r),floating:{x:0,y:0,...await l(n)}}};function a4(e){return Hn(e).direction==="rtl"}const c4={convertOffsetParentRelativeRectToViewportRelativeRect:J3,getDocumentElement:xi,getClippingRect:o4,getOffsetParent:yk,getElementRects:s4,getClientRects:e4,getDimensions:l4,getScale:$l,isElement:gt,isRTL:a4};function f4(e,t){let n=null,r;const i=xi(e);function l(){clearTimeout(r),n&&n.disconnect(),n=null}function s(a,f){a===void 0&&(a=!1),f===void 0&&(f=1),l();const{left:d,top:h,width:g,height:y}=e.getBoundingClientRect();if(a||t(),!g||!y)return;const m=Tl(h),w=Tl(i.clientWidth-(d+g)),E=Tl(i.clientHeight-(h+y)),A=Tl(d),S={rootMargin:-m+"px "+-w+"px "+-E+"px "+-A+"px",threshold:Do(0,Wc(1,f))||1};let _=!0;function P(D){const R=D[0].intersectionRatio;if(R!==f){if(!_)return s();R?s(!1,R):r=setTimeout(()=>{s(!1,1e-7)},100)}_=!1}try{n=new IntersectionObserver(P,{...S,root:i.ownerDocument})}catch{n=new IntersectionObserver(P,S)}n.observe(e)}return s(!0),l}function d4(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:i=!0,ancestorResize:l=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:f=!1}=r,d=av(e),h=i||l?[...d?Zi(d):[],...Zi(t)]:[];h.forEach(v=>{i&&v.addEventListener("scroll",n,{passive:!0}),l&&v.addEventListener("resize",n)});const g=d&&a?f4(d,n):null;let y=-1,m=null;s&&(m=new ResizeObserver(v=>{let[S]=v;S&&S.target===d&&m&&(m.unobserve(t),cancelAnimationFrame(y),y=requestAnimationFrame(()=>{m&&m.observe(t)})),n()}),d&&!f&&m.observe(d),m.observe(t));let w,E=f?Wo(e):null;f&&A();function A(){const v=Wo(e);E&&(v.x!==E.x||v.y!==E.y||v.width!==E.width||v.height!==E.height)&&n(),E=v,w=requestAnimationFrame(A)}return n(),()=>{h.forEach(v=>{i&&v.removeEventListener("scroll",n),l&&v.removeEventListener("resize",n)}),g&&g(),m&&m.disconnect(),m=null,f&&cancelAnimationFrame(w)}}const p4=(e,t,n)=>{const r=new Map,i={platform:c4,...n},l={...i.platform,_c:r};return Q3(e,t,{...i,platform:l})};var uc=typeof document<"u"?T.exports.useLayoutEffect:T.exports.useEffect;function Qc(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,i;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Qc(e[r],t[r]))return!1;return!0}if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,i[r]))return!1;for(r=n;r--!==0;){const l=i[r];if(!(l==="_owner"&&e.$$typeof)&&!Qc(e[l],t[l]))return!1}return!0}return e!==e&&t!==t}function xk(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Wx(e,t){const n=xk(e);return Math.round(t*n)/n}function Vx(e){const t=T.exports.useRef(e);return uc(()=>{t.current=e}),t}function h4(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:i,elements:{reference:l,floating:s}={},transform:a=!0,whileElementsMounted:f,open:d}=e,[h,g]=T.exports.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[y,m]=T.exports.useState(r);Qc(y,r)||m(r);const[w,E]=T.exports.useState(null),[A,v]=T.exports.useState(null),S=T.exports.useCallback(oe=>{oe!=R.current&&(R.current=oe,E(oe))},[E]),_=T.exports.useCallback(oe=>{oe!==F.current&&(F.current=oe,v(oe))},[v]),P=l||w,D=s||A,R=T.exports.useRef(null),F=T.exports.useRef(null),z=T.exports.useRef(h),q=Vx(f),K=Vx(i),B=T.exports.useCallback(()=>{if(!R.current||!F.current)return;const oe={placement:t,strategy:n,middleware:y};K.current&&(oe.platform=K.current),p4(R.current,F.current,oe).then(ue=>{const U={...ue,isPositioned:!0};X.current&&!Qc(z.current,U)&&(z.current=U,Vo.exports.flushSync(()=>{g(U)}))})},[y,t,n,K]);uc(()=>{d===!1&&z.current.isPositioned&&(z.current.isPositioned=!1,g(oe=>({...oe,isPositioned:!1})))},[d]);const X=T.exports.useRef(!1);uc(()=>(X.current=!0,()=>{X.current=!1}),[]),uc(()=>{if(P&&(R.current=P),D&&(F.current=D),P&&D){if(q.current)return q.current(P,D,B);B()}},[P,D,B,q]);const $=T.exports.useMemo(()=>({reference:R,floating:F,setReference:S,setFloating:_}),[S,_]),H=T.exports.useMemo(()=>({reference:P,floating:D}),[P,D]),ie=T.exports.useMemo(()=>{const oe={position:n,left:0,top:0};if(!H.floating)return oe;const ue=Wx(H.floating,h.x),U=Wx(H.floating,h.y);return a?{...oe,transform:"translate("+ue+"px, "+U+"px)",...xk(H.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:ue,top:U}},[n,a,H.floating,h.x,h.y]);return T.exports.useMemo(()=>({...h,update:B,refs:$,elements:H,floatingStyles:ie}),[h,B,$,H,ie])}var g4=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Sg=g4.join(","),wk=typeof Element>"u",Es=wk?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Yc=!wk&&Element.prototype.getRootNode?function(e){var t;return e==null||(t=e.getRootNode)===null||t===void 0?void 0:t.call(e)}:function(e){return e?.ownerDocument},Xc=function e(t,n){var r;n===void 0&&(n=!0);var i=t==null||(r=t.getAttribute)===null||r===void 0?void 0:r.call(t,"inert"),l=i===""||i==="true",s=l||n&&t&&e(t.parentNode);return s},m4=function(t){var n,r=t==null||(n=t.getAttribute)===null||n===void 0?void 0:n.call(t,"contenteditable");return r===""||r==="true"},v4=function(t,n,r){if(Xc(t))return[];var i=Array.prototype.slice.apply(t.querySelectorAll(Sg));return n&&Es.call(t,Sg)&&i.unshift(t),i=i.filter(r),i},y4=function e(t,n,r){for(var i=[],l=Array.from(t);l.length;){var s=l.shift();if(!Xc(s,!1))if(s.tagName==="SLOT"){var a=s.assignedElements(),f=a.length?a:s.children,d=e(f,!0,r);r.flatten?i.push.apply(i,d):i.push({scopeParent:s,candidates:d})}else{var h=Es.call(s,Sg);h&&r.filter(s)&&(n||!t.includes(s))&&i.push(s);var g=s.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(s),y=!Xc(g,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(s));if(g&&y){var m=e(g===!0?s.children:g.children,!0,r);r.flatten?i.push.apply(i,m):i.push({scopeParent:s,candidates:m})}else l.unshift.apply(l,s.children)}}return i},Sk=function(t){return!isNaN(parseInt(t.getAttribute("tabindex"),10))},Ek=function(t){if(!t)throw new Error("No node provided");return t.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(t.tagName)||m4(t))&&!Sk(t)?0:t.tabIndex},x4=function(t,n){var r=Ek(t);return r<0&&n&&!Sk(t)?0:r},w4=function(t,n){return t.tabIndex===n.tabIndex?t.documentOrder-n.documentOrder:t.tabIndex-n.tabIndex},Ck=function(t){return t.tagName==="INPUT"},S4=function(t){return Ck(t)&&t.type==="hidden"},E4=function(t){var n=t.tagName==="DETAILS"&&Array.prototype.slice.apply(t.children).some(function(r){return r.tagName==="SUMMARY"});return n},C4=function(t,n){for(var r=0;rsummary:first-of-type"),s=l?t.parentElement:t;if(Es.call(s,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof i=="function"){for(var a=t;t;){var f=t.parentElement,d=Yc(t);if(f&&!f.shadowRoot&&i(f)===!0)return qx(t);t.assignedSlot?t=t.assignedSlot:!f&&d!==t.ownerDocument?t=d.host:t=f}t=a}if(O4(t))return!t.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return qx(t);return!1},T4=function(t){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(t.tagName))for(var n=t.parentElement;n;){if(n.tagName==="FIELDSET"&&n.disabled){for(var r=0;r=0)},A4=function e(t){var n=[],r=[];return t.forEach(function(i,l){var s=!!i.scopeParent,a=s?i.scopeParent:i,f=x4(a,s),d=s?e(i.candidates):a;f===0?s?n.push.apply(n,d):n.push(a):r.push({documentOrder:l,tabIndex:f,item:i,isScope:s,content:d})}),r.sort(w4).reduce(function(i,l){return l.isScope?i.push.apply(i,l.content):i.push(l.content),i},[]).concat(n)},cv=function(t,n){n=n||{};var r;return n.getShadowRoot?r=y4([t],n.includeContainer,{filter:Gx.bind(null,n),flatten:!1,getShadowRoot:n.getShadowRoot,shadowRootFilter:P4}):r=v4(t,n.includeContainer,Gx.bind(null,n)),A4(r)};function fv(e){return T.exports.useMemo(()=>e.every(t=>t==null)?null:t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})},e)}const dv="ArrowUp",Qf="ArrowDown",Xl="ArrowLeft",Ps="ArrowRight";function Ua(e,t,n){return Math.floor(e/t)!==n}function Zu(e,t){return t<0||t>=e.current.length}function Yp(e,t){return Zt(e,{disabledIndices:t})}function Kx(e,t){return Zt(e,{decrement:!0,startingIndex:e.current.length,disabledIndices:t})}function Zt(e,t){let{startingIndex:n=-1,decrement:r=!1,disabledIndices:i,amount:l=1}=t===void 0?{}:t;const s=e.current;let a=n;do{var f,d;a=a+(r?-l:l)}while(a>=0&&a<=s.length-1&&(i?i.includes(a):s[a]==null||((f=s[a])==null?void 0:f.hasAttribute("disabled"))||((d=s[a])==null?void 0:d.getAttribute("aria-disabled"))==="true"));return a}function D4(e,t){let{event:n,orientation:r,loop:i,cols:l,disabledIndices:s,minIndex:a,maxIndex:f,prevIndex:d,stopEvent:h=!1}=t,g=d;if(n.key===dv){if(h&&Ht(n),d===-1)g=f;else if(g=Zt(e,{startingIndex:g,amount:l,decrement:!0,disabledIndices:s}),i&&(d-ly?w:w-l}Zu(e,g)&&(g=d)}if(n.key===Qf&&(h&&Ht(n),d===-1?g=a:(g=Zt(e,{startingIndex:d,amount:l,disabledIndices:s}),i&&d+l>f&&(g=Zt(e,{startingIndex:d%l-l,amount:l,disabledIndices:s}))),Zu(e,g)&&(g=d)),r==="both"){const y=Tl(d/l);n.key===Ps&&(h&&Ht(n),d%l!==l-1?(g=Zt(e,{startingIndex:d,disabledIndices:s}),i&&Ua(g,l,y)&&(g=Zt(e,{startingIndex:d-d%l-1,disabledIndices:s}))):i&&(g=Zt(e,{startingIndex:d-d%l-1,disabledIndices:s})),Ua(g,l,y)&&(g=d)),n.key===Xl&&(h&&Ht(n),d%l!==0?(g=Zt(e,{startingIndex:d,disabledIndices:s,decrement:!0}),i&&Ua(g,l,y)&&(g=Zt(e,{startingIndex:d+(l-d%l),decrement:!0,disabledIndices:s}))):i&&(g=Zt(e,{startingIndex:d+(l-d%l),decrement:!0,disabledIndices:s})),Ua(g,l,y)&&(g=d));const m=Tl(f/l)===y;Zu(e,g)&&(i&&m?g=n.key===Xl?f:Zt(e,{startingIndex:d-d%l-1,disabledIndices:s}):g=d)}return g}let Qx=0;function oi(e,t){t===void 0&&(t={});const{preventScroll:n=!1,cancelPrevious:r=!0,sync:i=!1}=t;r&&cancelAnimationFrame(Qx);const l=()=>e?.focus({preventScroll:n});i?l():Qx=requestAnimationFrame(l)}var Ke=typeof document<"u"?T.exports.useLayoutEffect:T.exports.useEffect;function L4(e,t){const n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING||n&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:n&Node.DOCUMENT_POSITION_PRECEDING||n&Node.DOCUMENT_POSITION_CONTAINS?1:0}function M4(e,t){if(e.size!==t.size)return!1;for(const[n,r]of e.entries())if(r!==t.get(n))return!1;return!0}const kk=T.exports.createContext({register:()=>{},unregister:()=>{},map:new Map,elementsRef:{current:[]}});function N4(e){let{children:t,elementsRef:n,labelsRef:r}=e;const[i,l]=T.exports.useState(()=>new Map),s=T.exports.useCallback(f=>{l(d=>new Map(d).set(f,null))},[]),a=T.exports.useCallback(f=>{l(d=>{const h=new Map(d);return h.delete(f),h})},[]);return Ke(()=>{const f=new Map(i);Array.from(f.keys()).sort(L4).forEach((h,g)=>{f.set(h,g)}),M4(i,f)||l(f)},[i]),T.exports.createElement(kk.Provider,{value:T.exports.useMemo(()=>({register:s,unregister:a,map:i,elementsRef:n,labelsRef:r}),[s,a,i,n,r])},t)}function _k(e){let{label:t}=e===void 0?{}:e;const[n,r]=T.exports.useState(null),i=T.exports.useRef(null),{register:l,unregister:s,map:a,elementsRef:f,labelsRef:d}=T.exports.useContext(kk),h=T.exports.useCallback(g=>{if(i.current=g,n!==null&&(f.current[n]=g,d)){var y;const m=t!==void 0;d.current[n]=m?t:(y=g?.textContent)!=null?y:null}},[n,f,d,t]);return Ke(()=>{const g=i.current;if(g)return l(g),()=>{s(g)}},[l,s]),Ke(()=>{const g=i.current?a.get(i.current):null;g!=null&&r(g)},[a]),T.exports.useMemo(()=>({ref:h,index:n??-1}),[n,h])}function Cs(){return Cs=Object.assign?Object.assign.bind():function(e){for(var t=1;t"floating-ui-"+F4++;function z4(){const[e,t]=T.exports.useState(()=>Xp?Yx():void 0);return Ke(()=>{e==null&&t(Yx())},[]),T.exports.useEffect(()=>{Xp||(Xp=!0)},[]),e}const $4=lS["useId".toString()],As=$4||z4;function bk(){const e=new Map;return{emit(t,n){var r;(r=e.get(t))==null||r.forEach(i=>i(n))},on(t,n){e.set(t,[...e.get(t)||[],n])},off(t,n){var r;e.set(t,((r=e.get(t))==null?void 0:r.filter(i=>i!==n))||[])}}}const Ok=T.exports.createContext(null),Ik=T.exports.createContext(null),Ko=()=>{var e;return((e=T.exports.useContext(Ok))==null?void 0:e.id)||null},ao=()=>T.exports.useContext(Ik);function B4(e){const t=As(),n=ao(),r=Ko(),i=e||r;return Ke(()=>{const l={id:t,parentId:i};return n?.addNode(l),()=>{n?.removeNode(l)}},[n,t,i]),t}function U4(e){let{children:t,id:n}=e;const r=Ko();return T.exports.createElement(Ok.Provider,{value:T.exports.useMemo(()=>({id:n,parentId:r}),[n,r])},t)}function H4(e){let{children:t}=e;const n=T.exports.useRef([]),r=T.exports.useCallback(s=>{n.current=[...n.current,s]},[]),i=T.exports.useCallback(s=>{n.current=n.current.filter(a=>a!==s)},[]),l=T.exports.useState(()=>bk())[0];return T.exports.createElement(Ik.Provider,{value:T.exports.useMemo(()=>({nodesRef:n,addNode:r,removeNode:i,events:l}),[n,r,i,l])},t)}function Zl(e){return"data-floating-ui-"+e}function En(e){const t=T.exports.useRef(e);return Ke(()=>{t.current=e}),t}const Xx=Zl("safe-polygon");function Zp(e,t,n){return n&&!Kc(n)?0:typeof e=="number"?e:e?.[t]}function j4(e,t){t===void 0&&(t={});const{open:n,onOpenChange:r,dataRef:i,events:l,elements:{domReference:s,floating:a},refs:f}=e,{enabled:d=!0,delay:h=0,handleClose:g=null,mouseOnly:y=!1,restMs:m=0,move:w=!0}=t,E=ao(),A=Ko(),v=En(g),S=En(h),_=T.exports.useRef(),P=T.exports.useRef(),D=T.exports.useRef(),R=T.exports.useRef(),F=T.exports.useRef(!0),z=T.exports.useRef(!1),q=T.exports.useRef(()=>{}),K=T.exports.useCallback(()=>{var H;const ie=(H=i.current.openEvent)==null?void 0:H.type;return ie?.includes("mouse")&&ie!=="mousedown"},[i]);T.exports.useEffect(()=>{if(!d)return;function H(){clearTimeout(P.current),clearTimeout(R.current),F.current=!0}return l.on("dismiss",H),()=>{l.off("dismiss",H)}},[d,l]),T.exports.useEffect(()=>{if(!d||!v.current||!n)return;function H(oe){K()&&r(!1,oe)}const ie=an(a).documentElement;return ie.addEventListener("mouseleave",H),()=>{ie.removeEventListener("mouseleave",H)}},[a,n,r,d,v,i,K]);const B=T.exports.useCallback(function(H,ie){ie===void 0&&(ie=!0);const oe=Zp(S.current,"close",_.current);oe&&!D.current?(clearTimeout(P.current),P.current=setTimeout(()=>r(!1,H),oe)):ie&&(clearTimeout(P.current),r(!1,H))},[S,r]),X=T.exports.useCallback(()=>{q.current(),D.current=void 0},[]),$=T.exports.useCallback(()=>{if(z.current){const H=an(f.floating.current).body;H.style.pointerEvents="",H.removeAttribute(Xx),z.current=!1}},[f]);return T.exports.useEffect(()=>{if(!d)return;function H(){return i.current.openEvent?["click","mousedown"].includes(i.current.openEvent.type):!1}function ie(U){if(clearTimeout(P.current),F.current=!1,y&&!Kc(_.current)||m>0&&Zp(S.current,"open")===0)return;const J=Zp(S.current,"open",_.current);J?P.current=setTimeout(()=>{r(!0,U)},J):r(!0,U)}function oe(U){if(H())return;q.current();const J=an(a);if(clearTimeout(R.current),v.current){n||clearTimeout(P.current),D.current=v.current({...e,tree:E,x:U.clientX,y:U.clientY,onClose(){$(),X(),B(U)}});const b=D.current;J.addEventListener("mousemove",b),q.current=()=>{J.removeEventListener("mousemove",b)};return}(_.current==="touch"?!Lt(a,U.relatedTarget):!0)&&B(U)}function ue(U){H()||v.current==null||v.current({...e,tree:E,x:U.clientX,y:U.clientY,onClose(){$(),X(),B(U)}})(U)}if(gt(s)){const U=s;return n&&U.addEventListener("mouseleave",ue),a?.addEventListener("mouseleave",ue),w&&U.addEventListener("mousemove",ie,{once:!0}),U.addEventListener("mouseenter",ie),U.addEventListener("mouseleave",oe),()=>{n&&U.removeEventListener("mouseleave",ue),a?.removeEventListener("mouseleave",ue),w&&U.removeEventListener("mousemove",ie),U.removeEventListener("mouseenter",ie),U.removeEventListener("mouseleave",oe)}}},[s,a,d,e,y,m,w,B,X,$,r,n,E,S,v,i]),Ke(()=>{var H;if(!!d&&n&&(H=v.current)!=null&&H.__options.blockPointerEvents&&K()){const ue=an(a).body;if(ue.setAttribute(Xx,""),ue.style.pointerEvents="none",z.current=!0,gt(s)&&a){var ie,oe;const U=s,J=E==null||(ie=E.nodesRef.current.find(ee=>ee.id===A))==null||(oe=ie.context)==null?void 0:oe.elements.floating;return J&&(J.style.pointerEvents=""),U.style.pointerEvents="auto",a.style.pointerEvents="auto",()=>{U.style.pointerEvents="",a.style.pointerEvents=""}}}},[d,n,A,a,s,E,v,i,K]),Ke(()=>{n||(_.current=void 0,X(),$())},[n,X,$]),T.exports.useEffect(()=>()=>{X(),clearTimeout(P.current),clearTimeout(R.current),$()},[d,s,X,$]),T.exports.useMemo(()=>{if(!d)return{};function H(ie){_.current=ie.pointerType}return{reference:{onPointerDown:H,onPointerEnter:H,onMouseMove(ie){n||m===0||(clearTimeout(R.current),R.current=setTimeout(()=>{F.current||r(!0,ie.nativeEvent)},m))}},floating:{onMouseEnter(){clearTimeout(P.current)},onMouseLeave(ie){l.emit("dismiss",{type:"mouseLeave",data:{returnFocus:!1}}),B(ie.nativeEvent,!1)}}}},[l,d,m,n,r,B])}function W4(e,t){var n;let r=[],i=(n=e.find(l=>l.id===t))==null?void 0:n.parentId;for(;i;){const l=e.find(s=>s.id===i);i=l?.parentId,l&&(r=r.concat(l))}return r}function Lo(e,t){let n=e.filter(i=>{var l;return i.parentId===t&&((l=i.context)==null?void 0:l.open)}),r=n;for(;r.length;)r=e.filter(i=>{var l;return(l=r)==null?void 0:l.some(s=>{var a;return i.parentId===s.id&&((a=i.context)==null?void 0:a.open)})}),n=n.concat(r);return n}function V4(e,t){let n,r=-1;function i(l,s){s>r&&(n=l,r=s),Lo(e,l).forEach(f=>{i(f.id,s+1)})}return i(t,0),e.find(l=>l.id===n)}let pl=new WeakMap,Ha=new WeakSet,ja={},Jp=0;const q4=()=>typeof HTMLElement<"u"&&"inert"in HTMLElement.prototype,Tk=e=>e&&(e.host||Tk(e.parentNode)),G4=(e,t)=>t.map(n=>{if(e.contains(n))return n;const r=Tk(n);return e.contains(r)?r:null}).filter(n=>n!=null);function K4(e,t,n,r){const i="data-floating-ui-inert",l=r?"inert":n?"aria-hidden":null,s=G4(t,e),a=new Set,f=new Set(s),d=[];ja[i]||(ja[i]=new WeakMap);const h=ja[i];s.forEach(g),y(t),a.clear();function g(m){!m||a.has(m)||(a.add(m),m.parentNode&&g(m.parentNode))}function y(m){!m||f.has(m)||Array.prototype.forEach.call(m.children,w=>{if(a.has(w))y(w);else{const E=l?w.getAttribute(l):null,A=E!==null&&E!=="false",v=(pl.get(w)||0)+1,S=(h.get(w)||0)+1;pl.set(w,v),h.set(w,S),d.push(w),v===1&&A&&Ha.add(w),S===1&&w.setAttribute(i,""),!A&&l&&w.setAttribute(l,"true")}})}return Jp++,()=>{d.forEach(m=>{const w=(pl.get(m)||0)-1,E=(h.get(m)||0)-1;pl.set(m,w),h.set(m,E),w||(!Ha.has(m)&&l&&m.removeAttribute(l),Ha.delete(m)),E||m.removeAttribute(i)}),Jp--,Jp||(pl=new WeakMap,pl=new WeakMap,Ha=new WeakSet,ja={})}}function Zx(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);const r=an(e[0]).body;return K4(e.concat(Array.from(r.querySelectorAll("[aria-live]"))),r,t,n)}const pv=()=>({getShadowRoot:!0,displayCheck:typeof ResizeObserver=="function"&&ResizeObserver.toString().includes("[native code]")?"full":"none"});function Rk(e,t){const n=cv(e,pv());t==="prev"&&n.reverse();const r=n.indexOf(zi(an(e)));return n.slice(r+1)[0]}function Pk(){return Rk(document.body,"next")}function Ak(){return Rk(document.body,"prev")}function Ju(e,t){const n=t||e.currentTarget,r=e.relatedTarget;return!r||!Lt(n,r)}function Q4(e){cv(e,pv()).forEach(n=>{n.dataset.tabindex=n.getAttribute("tabindex")||"",n.setAttribute("tabindex","-1")})}function Y4(e){e.querySelectorAll("[data-tabindex]").forEach(n=>{const r=n.dataset.tabindex;delete n.dataset.tabindex,r?n.setAttribute("tabindex",r):n.removeAttribute("tabindex")})}const hv={border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"fixed",whiteSpace:"nowrap",width:"1px",top:0,left:0};let X4;function Jx(e){e.key==="Tab"&&(e.target,clearTimeout(X4))}const Zc=T.exports.forwardRef(function(t,n){const[r,i]=T.exports.useState();Ke(()=>(sk()&&i("button"),document.addEventListener("keydown",Jx),()=>{document.removeEventListener("keydown",Jx)}),[]);const l={ref:n,tabIndex:0,role:r,"aria-hidden":r?void 0:!0,[Zl("focus-guard")]:"",style:hv};return T.exports.createElement("span",Cs({},t,l))}),Dk=T.exports.createContext(null);function Z4(e){let{id:t,root:n}=e===void 0?{}:e;const[r,i]=T.exports.useState(null),l=As(),s=Lk(),a=T.exports.useMemo(()=>({id:t,root:n,portalContext:s,uniqueId:l}),[t,n,s,l]),f=T.exports.useRef();return Ke(()=>()=>{r?.remove()},[r,a]),Ke(()=>{if(f.current===a)return;f.current=a;const{id:d,root:h,portalContext:g,uniqueId:y}=a,m=d?document.getElementById(d):null,w=Zl("portal");if(m){const E=document.createElement("div");E.id=y,E.setAttribute(w,""),m.appendChild(E),i(E)}else{let E=h||g?.portalNode;E&&!gt(E)&&(E=E.current),E=E||document.body;let A=null;d&&(A=document.createElement("div"),A.id=d,E.appendChild(A));const v=document.createElement("div");v.id=y,v.setAttribute(w,""),E=A||E,E.appendChild(v),i(v)}},[a]),r}function gv(e){let{children:t,id:n,root:r=null,preserveTabOrder:i=!0}=e;const l=Z4({id:n,root:r}),[s,a]=T.exports.useState(null),f=T.exports.useRef(null),d=T.exports.useRef(null),h=T.exports.useRef(null),g=T.exports.useRef(null),y=!!s&&!s.modal&&s.open&&i&&!!(r||l);return T.exports.useEffect(()=>{if(!l||!i||s!=null&&s.modal)return;function m(w){l&&Ju(w)&&(w.type==="focusin"?Y4:Q4)(l)}return l.addEventListener("focusin",m,!0),l.addEventListener("focusout",m,!0),()=>{l.removeEventListener("focusin",m,!0),l.removeEventListener("focusout",m,!0)}},[l,i,s?.modal]),T.exports.createElement(Dk.Provider,{value:T.exports.useMemo(()=>({preserveTabOrder:i,beforeOutsideRef:f,afterOutsideRef:d,beforeInsideRef:h,afterInsideRef:g,portalNode:l,setFocusManagerState:a}),[i,l])},y&&l&&T.exports.createElement(Zc,{"data-type":"outside",ref:f,onFocus:m=>{if(Ju(m,l)){var w;(w=h.current)==null||w.focus()}else{const E=Ak()||s?.refs.domReference.current;E?.focus()}}}),y&&l&&T.exports.createElement("span",{"aria-owns":l.id,style:hv}),l&&Vo.exports.createPortal(t,l),y&&l&&T.exports.createElement(Zc,{"data-type":"outside",ref:d,onFocus:m=>{if(Ju(m,l)){var w;(w=g.current)==null||w.focus()}else{const E=Pk()||s?.refs.domReference.current;E?.focus(),s?.closeOnFocusOut&&s?.onOpenChange(!1,m.nativeEvent)}}}))}const Lk=()=>T.exports.useContext(Dk),J4=T.exports.forwardRef(function(t,n){return T.exports.createElement("button",Cs({},t,{type:"button",ref:n,tabIndex:-1,style:hv}))});function Mk(e){const{context:t,children:n,disabled:r=!1,order:i=["content"],guards:l=!0,initialFocus:s=0,returnFocus:a=!0,modal:f=!0,visuallyHiddenDismiss:d=!1,closeOnFocusOut:h=!0}=e,{open:g,refs:y,nodeId:m,onOpenChange:w,events:E,dataRef:A,elements:{domReference:v,floating:S}}=t,_=q4()?l:!0,P=En(i),D=En(s),R=En(a),F=ao(),z=Lk(),q=typeof s=="number"&&s<0,K=T.exports.useRef(null),B=T.exports.useRef(null),X=T.exports.useRef(!1),$=T.exports.useRef(null),H=T.exports.useRef(!1),ie=z!=null,oe=v&&v.getAttribute("role")==="combobox"&&ak(v)&&q,ue=T.exports.useCallback(function(b){return b===void 0&&(b=S),b?cv(b,pv()):[]},[S]),U=T.exports.useCallback(b=>{const O=ue(b);return P.current.map(fe=>v&&fe==="reference"?v:S&&fe==="floating"?S:O).filter(Boolean).flat()},[v,S,P,ue]);T.exports.useEffect(()=>{if(r||!f)return;function b(fe){if(fe.key==="Tab"){Lt(S,zi(an(S)))&&ue().length===0&&!oe&&Ht(fe);const ve=U(),Ae=sv(fe);P.current[0]==="reference"&&Ae===v&&(Ht(fe),fe.shiftKey?oi(ve[ve.length-1]):oi(ve[1])),P.current[1]==="floating"&&Ae===S&&fe.shiftKey&&(Ht(fe),oi(ve[0]))}}const O=an(S);return O.addEventListener("keydown",b),()=>{O.removeEventListener("keydown",b)}},[r,v,S,f,P,y,oe,ue,U]),T.exports.useEffect(()=>{if(r||!h)return;function b(){H.current=!0,setTimeout(()=>{H.current=!1})}function O(fe){const ve=fe.relatedTarget;queueMicrotask(()=>{const Ae=!(Lt(v,ve)||Lt(S,ve)||Lt(ve,S)||Lt(z?.portalNode,ve)||ve!=null&&ve.hasAttribute(Zl("focus-guard"))||F&&(Lo(F.nodesRef.current,m).find(de=>{var Oe,ye;return Lt((Oe=de.context)==null?void 0:Oe.elements.floating,ve)||Lt((ye=de.context)==null?void 0:ye.elements.domReference,ve)})||W4(F.nodesRef.current,m).find(de=>{var Oe,ye;return((Oe=de.context)==null?void 0:Oe.elements.floating)===ve||((ye=de.context)==null?void 0:ye.elements.domReference)===ve})));ve&&Ae&&!H.current&&ve!==$.current&&(X.current=!0,w(!1,fe))})}if(S&&nn(v))return v.addEventListener("focusout",O),v.addEventListener("pointerdown",b),!f&&S.addEventListener("focusout",O),()=>{v.removeEventListener("focusout",O),v.removeEventListener("pointerdown",b),!f&&S.removeEventListener("focusout",O)}},[r,v,S,f,m,F,z,w,h]),T.exports.useEffect(()=>{var b;if(r)return;const O=Array.from((z==null||(b=z.portalNode)==null?void 0:b.querySelectorAll("["+Zl("portal")+"]"))||[]);if(S){const fe=[S,...O,K.current,B.current,P.current.includes("reference")||oe?v:null].filter(Ae=>Ae!=null),ve=f?Zx(fe,_,!_):Zx(fe);return()=>{ve()}}},[r,v,S,f,P,z,oe,_]),Ke(()=>{if(r||!S)return;const b=an(S),O=zi(b);queueMicrotask(()=>{const fe=U(S),ve=D.current,Ae=(typeof ve=="number"?fe[ve]:ve.current)||S,de=Lt(S,O);!q&&!de&&g&&oi(Ae,{preventScroll:Ae===S})})},[r,g,S,q,U,D]),Ke(()=>{if(r||!S)return;let b=!1;const O=an(S),fe=zi(O),ve=A.current;$.current=fe;function Ae(de){if(de.type==="escapeKey"&&y.domReference.current&&($.current=y.domReference.current),["referencePress","escapeKey"].includes(de.type))return;const Oe=de.data.returnFocus;typeof Oe=="object"?(X.current=!1,b=Oe.preventScroll):X.current=!Oe}return E.on("dismiss",Ae),()=>{E.off("dismiss",Ae);const de=zi(O);(Lt(S,de)||F&&Lo(F.nodesRef.current,m).some(ye=>{var Fe;return Lt((Fe=ye.context)==null?void 0:Fe.elements.floating,de)})||ve.openEvent&&["click","mousedown"].includes(ve.openEvent.type))&&y.domReference.current&&($.current=y.domReference.current),R.current&&nn($.current)&&!X.current&&oi($.current,{cancelPrevious:!1,preventScroll:b})}},[r,S,R,A,y,E,F,m]),Ke(()=>{if(!(r||!z))return z.setFocusManagerState({modal:f,closeOnFocusOut:h,open:g,onOpenChange:w,refs:y}),()=>{z.setFocusManagerState(null)}},[r,z,f,g,w,y,h]),Ke(()=>{if(!r&&S&&typeof MutationObserver=="function"&&!q){const b=()=>{const fe=S.getAttribute("tabindex");P.current.includes("floating")||zi(an(S))!==y.domReference.current&&ue().length===0?fe!=="0"&&S.setAttribute("tabindex","0"):fe!=="-1"&&S.setAttribute("tabindex","-1")};b();const O=new MutationObserver(b);return O.observe(S,{childList:!0,subtree:!0,attributes:!0}),()=>{O.disconnect()}}},[r,S,y,P,ue,q]);function J(b){return r||!d||!f?null:T.exports.createElement(J4,{ref:b==="start"?K:B,onClick:O=>w(!1,O.nativeEvent)},typeof d=="string"?d:"Dismiss")}const ee=!r&&_&&!oe&&(ie||f);return T.exports.createElement(T.exports.Fragment,null,ee&&T.exports.createElement(Zc,{"data-type":"inside",ref:z?.beforeInsideRef,onFocus:b=>{if(f){const fe=U();oi(i[0]==="reference"?fe[0]:fe[fe.length-1])}else if(z!=null&&z.preserveTabOrder&&z.portalNode)if(X.current=!1,Ju(b,z.portalNode)){const fe=Pk()||v;fe?.focus()}else{var O;(O=z.beforeOutsideRef.current)==null||O.focus()}}}),!oe&&J("start"),n,J("end"),ee&&T.exports.createElement(Zc,{"data-type":"inside",ref:z?.afterInsideRef,onFocus:b=>{if(f)oi(U()[0]);else if(z!=null&&z.preserveTabOrder&&z.portalNode)if(h&&(X.current=!0),Ju(b,z.portalNode)){const fe=Ak()||v;fe?.focus()}else{var O;(O=z.afterOutsideRef.current)==null||O.focus()}}}))}const eh=new Set,Nk=T.exports.forwardRef(function(t,n){let{lockScroll:r=!1,...i}=t;const l=As();return Ke(()=>{if(!r)return;eh.add(l);const s=/iP(hone|ad|od)|iOS/.test(uv()),a=document.body.style,d=Math.round(document.documentElement.getBoundingClientRect().left)+document.documentElement.scrollLeft?"paddingLeft":"paddingRight",h=window.innerWidth-document.documentElement.clientWidth,g=a.left?parseFloat(a.left):window.pageXOffset,y=a.top?parseFloat(a.top):window.pageYOffset;if(a.overflow="hidden",h&&(a[d]=h+"px"),s){var m,w;const E=((m=window.visualViewport)==null?void 0:m.offsetLeft)||0,A=((w=window.visualViewport)==null?void 0:w.offsetTop)||0;Object.assign(a,{position:"fixed",top:-(y-Math.floor(A))+"px",left:-(g-Math.floor(E))+"px",right:"0"})}return()=>{eh.delete(l),eh.size===0&&(Object.assign(a,{overflow:"",[d]:""}),s&&(Object.assign(a,{position:"",top:"",left:"",right:""}),window.scrollTo(g,y)))}},[l,r]),T.exports.createElement("div",Cs({ref:n},i,{style:{position:"fixed",overflow:"auto",top:0,right:0,bottom:0,left:0,...i.style}}))});function ew(e){return nn(e.target)&&e.target.tagName==="BUTTON"}function tw(e){return ak(e)}function ez(e,t){t===void 0&&(t={});const{open:n,onOpenChange:r,dataRef:i,elements:{domReference:l}}=e,{enabled:s=!0,event:a="click",toggle:f=!0,ignoreMouse:d=!1,keyboardHandlers:h=!0}=t,g=T.exports.useRef(),y=T.exports.useRef(!1);return T.exports.useMemo(()=>s?{reference:{onPointerDown(m){g.current=m.pointerType},onMouseDown(m){m.button===0&&(Kc(g.current,!0)&&d||a!=="click"&&(n&&f&&(i.current.openEvent?i.current.openEvent.type==="mousedown":!0)?r(!1,m.nativeEvent):(m.preventDefault(),r(!0,m.nativeEvent))))},onClick(m){if(a==="mousedown"&&g.current){g.current=void 0;return}Kc(g.current,!0)&&d||(n&&f&&(i.current.openEvent?i.current.openEvent.type==="click":!0)?r(!1,m.nativeEvent):r(!0,m.nativeEvent))},onKeyDown(m){g.current=void 0,!(m.defaultPrevented||!h||ew(m))&&(m.key===" "&&!tw(l)&&(m.preventDefault(),y.current=!0),m.key==="Enter"&&r(!(n&&f),m.nativeEvent))},onKeyUp(m){m.defaultPrevented||!h||ew(m)||tw(l)||m.key===" "&&y.current&&(y.current=!1,r(!(n&&f),m.nativeEvent))}}}:{},[s,i,a,d,h,l,f,n,r])}const tz=lS["useInsertionEffect".toString()],nz=tz||(e=>e());function Ji(e){const t=T.exports.useRef(()=>{});return nz(()=>{t.current=e}),T.exports.useCallback(function(){for(var n=arguments.length,r=new Array(n),i=0;i{var t,n;return{escapeKeyBubbles:typeof e=="boolean"?e:(t=e?.escapeKey)!=null?t:!1,outsidePressBubbles:typeof e=="boolean"?e:(n=e?.outsidePress)!=null?n:!0}};function Fk(e,t){t===void 0&&(t={});const{open:n,onOpenChange:r,events:i,nodeId:l,elements:{reference:s,domReference:a,floating:f},dataRef:d}=e,{enabled:h=!0,escapeKey:g=!0,outsidePress:y=!0,outsidePressEvent:m="pointerdown",referencePress:w=!1,referencePressEvent:E="pointerdown",ancestorScroll:A=!1,bubbles:v}=t,S=ao(),_=Ko()!=null,P=Ji(typeof y=="function"?y:()=>!1),D=typeof y=="function"?P:y,R=T.exports.useRef(!1),{escapeKeyBubbles:F,outsidePressBubbles:z}=oz(v),q=Ji(B=>{if(!n||!h||!g||B.key!=="Escape")return;const X=S?Lo(S.nodesRef.current,l):[];if(!F&&(B.stopPropagation(),X.length>0)){let $=!0;if(X.forEach(H=>{var ie;if((ie=H.context)!=null&&ie.open&&!H.context.dataRef.current.__escapeKeyBubbles){$=!1;return}}),!$)return}i.emit("dismiss",{type:"escapeKey",data:{returnFocus:{preventScroll:!1}}}),r(!1,q3(B)?B.nativeEvent:B)}),K=Ji(B=>{const X=R.current;if(R.current=!1,X||typeof D=="function"&&!D(B))return;const $=sv(B),H="["+Zl("inert")+"]",ie=an(f).querySelectorAll(H);let oe=gt($)?$:null;for(;oe&&!Rs(oe);){const J=jo(oe);if(J===an(f).body||!gt(J))break;oe=J}if(ie.length&>($)&&!G3($)&&!Lt($,f)&&Array.from(ie).every(J=>!Lt(oe,J)))return;if(nn($)&&f){const J=$.clientWidth>0&&$.scrollWidth>$.clientWidth,ee=$.clientHeight>0&&$.scrollHeight>$.clientHeight;let b=ee&&B.offsetX>$.clientWidth;if(ee&&Hn($).direction==="rtl"&&(b=B.offsetX<=$.offsetWidth-$.clientWidth),b||J&&B.offsetY>$.clientHeight)return}const ue=S&&Lo(S.nodesRef.current,l).some(J=>{var ee;return Qp(B,(ee=J.context)==null?void 0:ee.elements.floating)});if(Qp(B,f)||Qp(B,a)||ue)return;const U=S?Lo(S.nodesRef.current,l):[];if(U.length>0){let J=!0;if(U.forEach(ee=>{var b;if((b=ee.context)!=null&&b.open&&!ee.context.dataRef.current.__outsidePressBubbles){J=!1;return}}),!J)return}i.emit("dismiss",{type:"outsidePress",data:{returnFocus:_?{preventScroll:!0}:lk(B)||uk(B)}}),r(!1,B)});return T.exports.useEffect(()=>{if(!n||!h)return;d.current.__escapeKeyBubbles=F,d.current.__outsidePressBubbles=z;function B(H){r(!1,H)}const X=an(f);g&&X.addEventListener("keydown",q),D&&X.addEventListener(m,K);let $=[];return A&&(gt(a)&&($=Zi(a)),gt(f)&&($=$.concat(Zi(f))),!gt(s)&&s&&s.contextElement&&($=$.concat(Zi(s.contextElement)))),$=$.filter(H=>{var ie;return H!==((ie=X.defaultView)==null?void 0:ie.visualViewport)}),$.forEach(H=>{H.addEventListener("scroll",B,{passive:!0})}),()=>{g&&X.removeEventListener("keydown",q),D&&X.removeEventListener(m,K),$.forEach(H=>{H.removeEventListener("scroll",B)})}},[d,f,a,s,g,D,m,n,r,A,h,F,z,q,K]),T.exports.useEffect(()=>{R.current=!1},[D,m]),T.exports.useMemo(()=>h?{reference:{onKeyDown:q,[rz[E]]:B=>{w&&(i.emit("dismiss",{type:"referencePress",data:{returnFocus:!1}}),r(!1,B.nativeEvent))}},floating:{onKeyDown:q,[iz[m]]:()=>{R.current=!0}}}:{},[h,i,w,m,E,r,q])}function mv(e){var t;e===void 0&&(e={});const{open:n=!1,onOpenChange:r,nodeId:i}=e,[l,s]=T.exports.useState(null),a=((t=e.elements)==null?void 0:t.reference)||l,f=h4(e),d=ao(),h=Ji((P,D)=>{P&&(y.current.openEvent=D),r?.(P,D)}),g=T.exports.useRef(null),y=T.exports.useRef({}),m=T.exports.useState(()=>bk())[0],w=As(),E=T.exports.useCallback(P=>{const D=gt(P)?{getBoundingClientRect:()=>P.getBoundingClientRect(),contextElement:P}:P;f.refs.setReference(D)},[f.refs]),A=T.exports.useCallback(P=>{(gt(P)||P===null)&&(g.current=P,s(P)),(gt(f.refs.reference.current)||f.refs.reference.current===null||P!==null&&!gt(P))&&f.refs.setReference(P)},[f.refs]),v=T.exports.useMemo(()=>({...f.refs,setReference:A,setPositionReference:E,domReference:g}),[f.refs,A,E]),S=T.exports.useMemo(()=>({...f.elements,domReference:a}),[f.elements,a]),_=T.exports.useMemo(()=>({...f,refs:v,elements:S,dataRef:y,nodeId:i,floatingId:w,events:m,open:n,onOpenChange:h}),[f,i,w,m,n,h,v,S]);return Ke(()=>{const P=d?.nodesRef.current.find(D=>D.id===i);P&&(P.context=_)}),T.exports.useMemo(()=>({...f,context:_,refs:v,elements:S}),[f,v,S,_])}function th(e,t,n){const r=new Map;return{...n==="floating"&&{tabIndex:-1},...e,...t.map(i=>i?i[n]:null).concat(e).reduce((i,l)=>(l&&Object.entries(l).forEach(s=>{let[a,f]=s;if(a.indexOf("on")===0){if(r.has(a)||r.set(a,[]),typeof f=="function"){var d;(d=r.get(a))==null||d.push(f),i[a]=function(){for(var h,g=arguments.length,y=new Array(g),m=0;mw(...y)).find(w=>w!==void 0)}}}else i[a]=f}),i),{})}}function zk(e){e===void 0&&(e=[]);const t=e,n=T.exports.useCallback(l=>th(l,e,"reference"),t),r=T.exports.useCallback(l=>th(l,e,"floating"),t),i=T.exports.useCallback(l=>th(l,e,"item"),e.map(l=>l?.item));return T.exports.useMemo(()=>({getReferenceProps:n,getFloatingProps:r,getItemProps:i}),[n,r,i])}let nw=!1;function Yf(e,t,n){switch(e){case"vertical":return t;case"horizontal":return n;default:return t||n}}function rw(e,t){return Yf(t,e===dv||e===Qf,e===Xl||e===Ps)}function nh(e,t,n){return Yf(t,e===Qf,n?e===Xl:e===Ps)||e==="Enter"||e==" "||e===""}function lz(e,t,n){return Yf(t,n?e===Xl:e===Ps,e===Qf)}function iw(e,t,n){return Yf(t,n?e===Ps:e===Xl,e===dv)}function uz(e,t){const{open:n,onOpenChange:r,refs:i,elements:{domReference:l,floating:s}}=e,{listRef:a,activeIndex:f,onNavigate:d=()=>{},enabled:h=!0,selectedIndex:g=null,allowEscape:y=!1,loop:m=!1,nested:w=!1,rtl:E=!1,virtual:A=!1,focusItemOnOpen:v="auto",focusItemOnHover:S=!0,openOnArrowKeyDown:_=!0,disabledIndices:P=void 0,orientation:D="vertical",cols:R=1,scrollItemIntoView:F=!0,virtualItemRef:z}=t,q=Ko(),K=ao(),B=Ji(d),X=T.exports.useRef(v),$=T.exports.useRef(g??-1),H=T.exports.useRef(null),ie=T.exports.useRef(!0),oe=T.exports.useRef(B),ue=T.exports.useRef(!!s),U=T.exports.useRef(!1),J=T.exports.useRef(!1),ee=En(P),b=En(n),O=En(F),[fe,ve]=T.exports.useState(),[Ae,de]=T.exports.useState(),Oe=Ji(function(Te,Ue,$e){$e===void 0&&($e=!1);const We=Te.current[Ue.current];!We||(A?(ve(We.id),K?.events.emit("virtualfocus",We),z&&(z.current=We)):oi(We,{preventScroll:!0,sync:V3()&&sk()?nw||U.current:!1}),requestAnimationFrame(()=>{const yt=O.current;yt&&We&&($e||!ie.current)&&(We.scrollIntoView==null||We.scrollIntoView(typeof yt=="boolean"?{block:"nearest",inline:"nearest"}:yt))}))});Ke(()=>{document.createElement("div").focus({get preventScroll(){return nw=!0,!1}})},[]),Ke(()=>{!h||(n&&s?X.current&&g!=null&&(J.current=!0,B(g)):ue.current&&($.current=-1,oe.current(null)))},[h,n,s,g,B]),Ke(()=>{if(!!h&&n&&s)if(f==null){if(U.current=!1,g!=null)return;if(ue.current&&($.current=-1,Oe(a,$)),!ue.current&&X.current&&(H.current!=null||X.current===!0&&H.current==null)){let Te=0;const Ue=()=>{a.current[0]==null?(Te<2&&(Te?requestAnimationFrame:queueMicrotask)(Ue),Te++):($.current=H.current==null||nh(H.current,D,E)||w?Yp(a,ee.current):Kx(a,ee.current),H.current=null,B($.current))};Ue()}}else Zu(a,f)||($.current=f,Oe(a,$,J.current),J.current=!1)},[h,n,s,f,g,w,a,D,E,B,Oe,ee]),Ke(()=>{var Te,Ue;if(!h||s||!K||A||!ue.current)return;const $e=K.nodesRef.current,We=(Te=$e.find(he=>he.id===q))==null||(Ue=Te.context)==null?void 0:Ue.elements.floating,yt=zi(an(s)),qn=$e.some(he=>he.context&&Lt(he.context.elements.floating,yt));We&&!qn&&ie.current&&We.focus({preventScroll:!0})},[h,s,K,q,A]),Ke(()=>{if(!h||!K||!A||q)return;function Te(Ue){de(Ue.id),z&&(z.current=Ue)}return K.events.on("virtualfocus",Te),()=>{K.events.off("virtualfocus",Te)}},[h,K,A,q,z]),Ke(()=>{oe.current=B,ue.current=!!s}),Ke(()=>{n||(H.current=null)},[n]);const ye=f!=null,Fe=T.exports.useMemo(()=>{function Te($e){if(!n)return;const We=a.current.indexOf($e);We!==-1&&B(We)}return{onFocus($e){let{currentTarget:We}=$e;Te(We)},onClick:$e=>{let{currentTarget:We}=$e;return We.focus({preventScroll:!0})},...S&&{onMouseMove($e){let{currentTarget:We}=$e;Te(We)},onPointerLeave($e){let{pointerType:We}=$e;!ie.current||We==="touch"||($.current=-1,Oe(a,$),B(null),A||oi(i.floating.current,{preventScroll:!0}))}}}},[n,i,Oe,S,a,B,A]);return T.exports.useMemo(()=>{if(!h)return{};const Te=ee.current;function Ue(he){if(ie.current=!1,U.current=!0,!b.current&&he.currentTarget===i.floating.current)return;if(w&&iw(he.key,D,E)){Ht(he),r(!1,he.nativeEvent),nn(l)&&!A&&l.focus();return}const ut=$.current,zt=Yp(a,Te),pn=Kx(a,Te);if(he.key==="Home"&&(Ht(he),$.current=zt,B($.current)),he.key==="End"&&(Ht(he),$.current=pn,B($.current)),!(R>1&&($.current=D4(a,{event:he,orientation:D,loop:m,cols:R,disabledIndices:Te,minIndex:zt,maxIndex:pn,prevIndex:$.current,stopEvent:!0}),B($.current),D==="both"))&&rw(he.key,D)){if(Ht(he),n&&!A&&zi(he.currentTarget.ownerDocument)===he.currentTarget){$.current=nh(he.key,D,E)?zt:pn,B($.current);return}nh(he.key,D,E)?m?$.current=ut>=pn?y&&ut!==a.current.length?-1:zt:Zt(a,{startingIndex:ut,disabledIndices:Te}):$.current=Math.min(pn,Zt(a,{startingIndex:ut,disabledIndices:Te})):m?$.current=ut<=zt?y&&ut!==-1?a.current.length:pn:Zt(a,{startingIndex:ut,decrement:!0,disabledIndices:Te}):$.current=Math.max(zt,Zt(a,{startingIndex:ut,decrement:!0,disabledIndices:Te})),Zu(a,$.current)?B(null):B($.current)}}function $e(he){v==="auto"&&lk(he.nativeEvent)&&(X.current=!0)}function We(he){X.current=v,v==="auto"&&uk(he.nativeEvent)&&(X.current=!0)}const yt=A&&n&&ye&&{"aria-activedescendant":Ae||fe},qn=a.current.find(he=>he?.id===fe);return{reference:{...yt,onKeyDown(he){ie.current=!1;const ut=he.key.indexOf("Arrow")===0,zt=lz(he.key,D,E),pn=iw(he.key,D,E),Gn=rw(he.key,D),Vt=(w?zt:Gn)||he.key==="Enter"||he.key.trim()==="";if(A&&n){const Pr=K?.nodesRef.current.find(Qn=>Qn.parentId==null),Kn=K&&Pr?V4(K.nodesRef.current,Pr.id):null;if(ut&&Kn&&z){const Qn=new KeyboardEvent("keydown",{key:he.key,bubbles:!0});if(zt||pn){var vr,qr;const W=((vr=Kn.context)==null?void 0:vr.elements.domReference)===he.currentTarget,re=pn&&!W?(qr=Kn.context)==null?void 0:qr.elements.domReference:zt?qn:null;re&&(Ht(he),re.dispatchEvent(Qn),de(void 0))}if(Gn&&Kn.context&&Kn.context.open&&Kn.parentId&&he.currentTarget!==Kn.context.elements.domReference){var Yo;Ht(he),(Yo=Kn.context.elements.domReference)==null||Yo.dispatchEvent(Qn);return}}return Ue(he)}if(!(!n&&!_&&ut)){if(Vt&&(H.current=w&&Gn?null:he.key),w){zt&&(Ht(he),n?($.current=Yp(a,Te),B($.current)):r(!0,he.nativeEvent));return}Gn&&(g!=null&&($.current=g),Ht(he),!n&&_?r(!0,he.nativeEvent):Ue(he),n&&B($.current))}},onFocus(){n&&B(null)},onPointerDown:We,onMouseDown:$e,onClick:$e},floating:{"aria-orientation":D==="both"?void 0:D,...yt,onKeyDown:Ue,onPointerMove(){ie.current=!0}},item:Fe}},[l,i,fe,Ae,ee,b,a,h,D,E,A,n,ye,w,g,_,y,R,m,v,B,r,Fe,K,z])}function sz(e,t){t===void 0&&(t={});const{open:n,floatingId:r}=e,{enabled:i=!0,role:l="dialog"}=t,s=As();return T.exports.useMemo(()=>{const a={id:r,role:l};return i?l==="tooltip"?{reference:{"aria-describedby":n?r:void 0},floating:a}:{reference:{"aria-expanded":n?"true":"false","aria-haspopup":l==="alertdialog"?"dialog":l,"aria-controls":n?r:void 0,...l==="listbox"&&{role:"combobox"},...l==="menu"&&{id:s}},floating:{...a,...l==="menu"&&{"aria-labelledby":s}}}:{}},[i,l,n,r,s])}const ow=e=>e.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(t,n)=>(n?"-":"")+t.toLowerCase());function hl(e,t){return typeof e=="function"?e(t):e}function az(e,t){const[n,r]=T.exports.useState(e);return e&&!n&&r(!0),T.exports.useEffect(()=>{if(!e){const i=setTimeout(()=>r(!1),t);return()=>clearTimeout(i)}},[e,t]),n}function cz(e,t){t===void 0&&(t={});const{open:n,elements:{floating:r}}=e,{duration:i=250}=t,s=(typeof i=="number"?i:i.close)||0,[a,f]=T.exports.useState(!1),[d,h]=T.exports.useState("unmounted"),g=az(n,s);return Ke(()=>{a&&!g&&h("unmounted")},[a,g]),Ke(()=>{if(!!r)if(n){h("initial");const y=requestAnimationFrame(()=>{h("open")});return()=>{cancelAnimationFrame(y)}}else f(!0),h("close")},[n,r]),{isMounted:g,status:d}}function vv(e,t){t===void 0&&(t={});const{initial:n={opacity:0},open:r,close:i,common:l,duration:s=250}=t,a=e.placement,f=a.split("-")[0],d=T.exports.useMemo(()=>({side:f,placement:a}),[f,a]),h=typeof s=="number",g=(h?s:s.open)||0,y=(h?s:s.close)||0,[m,w]=T.exports.useState(()=>({...hl(l,d),...hl(n,d)})),{isMounted:E,status:A}=cz(e,{duration:s}),v=En(n),S=En(r),_=En(i),P=En(l);return Ke(()=>{const D=hl(v.current,d),R=hl(_.current,d),F=hl(P.current,d),z=hl(S.current,d)||Object.keys(D).reduce((q,K)=>(q[K]="",q),{});if(A==="initial"&&w(q=>({transitionProperty:q.transitionProperty,...F,...D})),A==="open"&&w({transitionProperty:Object.keys(z).map(ow).join(","),transitionDuration:g+"ms",...F,...z}),A==="close"){const q=R||D;w({transitionProperty:Object.keys(q).map(ow).join(","),transitionDuration:y+"ms",...F,...q})}},[y,_,v,S,P,g,A,d]),{isMounted:E,styles:m}}function fz(e,t){var n;const{open:r,dataRef:i}=e,{listRef:l,activeIndex:s,onMatch:a,onTypingChange:f,enabled:d=!0,findMatch:h=null,resetMs:g=750,ignoreKeys:y=[],selectedIndex:m=null}=t,w=T.exports.useRef(),E=T.exports.useRef(""),A=T.exports.useRef((n=m??s)!=null?n:-1),v=T.exports.useRef(null),S=Ji(a),_=Ji(f),P=En(h),D=En(y);return Ke(()=>{r&&(clearTimeout(w.current),v.current=null,E.current="")},[r]),Ke(()=>{if(r&&E.current===""){var R;A.current=(R=m??s)!=null?R:-1}},[r,m,s]),T.exports.useMemo(()=>{if(!d)return{};function R(q){q?i.current.typing||(i.current.typing=q,_(q)):i.current.typing&&(i.current.typing=q,_(q))}function F(q,K,B){const X=P.current?P.current(K,B):K.find($=>$?.toLocaleLowerCase().indexOf(B.toLocaleLowerCase())===0);return X?q.indexOf(X):-1}function z(q){const K=l.current;if(E.current.length>0&&E.current[0]!==" "&&(F(K,K,E.current)===-1?R(!1):q.key===" "&&Ht(q)),K==null||D.current.includes(q.key)||q.key.length!==1||q.ctrlKey||q.metaKey||q.altKey)return;r&&q.key!==" "&&(Ht(q),R(!0)),K.every(H=>{var ie,oe;return H?((ie=H[0])==null?void 0:ie.toLocaleLowerCase())!==((oe=H[1])==null?void 0:oe.toLocaleLowerCase()):!0})&&E.current===q.key&&(E.current="",A.current=v.current),E.current+=q.key,clearTimeout(w.current),w.current=setTimeout(()=>{E.current="",A.current=v.current,R(!1)},g);const X=A.current,$=F(K,[...K.slice((X||0)+1),...K.slice(0,(X||0)+1)],E.current);$!==-1?(S($),v.current=$):q.key!==" "&&(E.current="",R(!1))}return{reference:{onKeyDown:z},floating:{onKeyDown:z,onKeyUp(q){q.key===" "&&R(!1)}}}},[d,r,i,l,g,D,P,S,_])}function lw(e,t){const[n,r]=e;let i=!1;const l=t.length;for(let s=0,a=l-1;s=r!=g>=r&&n<=(h-f)*(r-d)/(g-d)+f&&(i=!i)}return i}function dz(e,t){return e[0]>=t.x&&e[0]<=t.x+t.width&&e[1]>=t.y&&e[1]<=t.y+t.height}function pz(e){e===void 0&&(e={});const{buffer:t=.5,blockPointerEvents:n=!1,requireIntent:r=!0}=e;let i,l=!1,s=null,a=null,f=performance.now();function d(g,y){const m=performance.now(),w=m-f;if(s===null||a===null||w===0)return s=g,a=y,f=m,null;const E=g-s,A=y-a,S=Math.sqrt(E*E+A*A)/w;return s=g,a=y,f=m,S}const h=g=>{let{x:y,y:m,placement:w,elements:E,onClose:A,nodeId:v,tree:S}=g;return function(P){function D(){clearTimeout(i),A()}if(clearTimeout(i),!E.domReference||!E.floating||w==null||y==null||m==null)return;const{clientX:R,clientY:F}=P,z=[R,F],q=sv(P),K=P.type==="mouseleave",B=Lt(E.floating,q),X=Lt(E.domReference,q),$=E.domReference.getBoundingClientRect(),H=E.floating.getBoundingClientRect(),ie=w.split("-")[0],oe=y>H.right-H.width/2,ue=m>H.bottom-H.height/2,U=dz(z,$),J=H.width>$.width,ee=H.height>$.height,b=(J?$:H).left,O=(J?$:H).right,fe=(ee?$:H).top,ve=(ee?$:H).bottom;if(B&&(l=!0,!K))return;if(X&&(l=!1),X&&!K){l=!0;return}if(K&>(P.relatedTarget)&&Lt(E.floating,P.relatedTarget)||S&&Lo(S.nodesRef.current,v).some(Oe=>{let{context:ye}=Oe;return ye?.open}))return;if(ie==="top"&&m>=$.bottom-1||ie==="bottom"&&m<=$.top+1||ie==="left"&&y>=$.right-1||ie==="right"&&y<=$.left+1)return D();let Ae=[];switch(ie){case"top":Ae=[[b,$.top+1],[b,H.bottom-1],[O,H.bottom-1],[O,$.top+1]];break;case"bottom":Ae=[[b,H.top+1],[b,$.bottom-1],[O,$.bottom-1],[O,H.top+1]];break;case"left":Ae=[[H.right-1,ve],[H.right-1,fe],[$.left+1,fe],[$.left+1,ve]];break;case"right":Ae=[[$.right-1,ve],[$.right-1,fe],[H.left+1,fe],[H.left+1,ve]];break}function de(Oe){let[ye,Fe]=Oe;switch(ie){case"top":{const Te=[J?ye+t/2:oe?ye+t*4:ye-t*4,Fe+t+1],Ue=[J?ye-t/2:oe?ye+t*4:ye-t*4,Fe+t+1],$e=[[H.left,oe||J?H.bottom-t:H.top],[H.right,oe?J?H.bottom-t:H.top:H.bottom-t]];return[Te,Ue,...$e]}case"bottom":{const Te=[J?ye+t/2:oe?ye+t*4:ye-t*4,Fe-t],Ue=[J?ye-t/2:oe?ye+t*4:ye-t*4,Fe-t],$e=[[H.left,oe||J?H.top+t:H.bottom],[H.right,oe?J?H.top+t:H.bottom:H.top+t]];return[Te,Ue,...$e]}case"left":{const Te=[ye+t+1,ee?Fe+t/2:ue?Fe+t*4:Fe-t*4],Ue=[ye+t+1,ee?Fe-t/2:ue?Fe+t*4:Fe-t*4];return[...[[ue||ee?H.right-t:H.left,H.top],[ue?ee?H.right-t:H.left:H.right-t,H.bottom]],Te,Ue]}case"right":{const Te=[ye-t,ee?Fe+t/2:ue?Fe+t*4:Fe-t*4],Ue=[ye-t,ee?Fe-t/2:ue?Fe+t*4:Fe-t*4],$e=[[ue||ee?H.left+t:H.right,H.top],[ue?ee?H.left+t:H.right:H.left+t,H.bottom]];return[Te,Ue,...$e]}}}if(!lw([R,F],Ae)){if(l&&!U)return D();if(!K&&r){const Oe=d(P.clientX,P.clientY);if(Oe!==null&&Oe<.1)return D()}lw([R,F],de([y,m]))?!l&&r&&(i=window.setTimeout(D,40)):D()}}};return h.__options={blockPointerEvents:n},h}const hz=({infoVisible:e,setInfoVisible:t})=>{const{refs:n,context:r}=mv({open:e,onOpenChange:t}),i=Fk(r,{outsidePressEvent:"mousedown"}),{isMounted:l,styles:s}=vv(r),{getFloatingProps:a}=zk([i]);return V(bn,{children:l&&V(gv,{children:V(Nk,{lockScroll:!0,className:"useful-controls-dialog-overlay","data-open":e,style:s,children:V(Mk,{context:r,children:we("div",{ref:n.setFloating,...a(),className:"useful-controls-dialog",style:s,children:[we("div",{className:"useful-controls-dialog-title",children:[V("p",{children:ot.ui_usefulcontrols||"Useful controls"}),V("div",{className:"useful-controls-dialog-close",onClick:()=>t(!1),children:V("svg",{xmlns:"http://www.w3.org/2000/svg",height:"1em",viewBox:"0 0 400 528",children:V("path",{d:"M376.6 84.5c11.3-13.6 9.5-33.8-4.1-45.1s-33.8-9.5-45.1 4.1L192 206 56.6 43.5C45.3 29.9 25.1 28.1 11.5 39.4S-3.9 70.9 7.4 84.5L150.3 256 7.4 427.5c-11.3 13.6-9.5 33.8 4.1 45.1s33.8 9.5 45.1-4.1L192 306 327.4 468.5c11.3 13.6 31.5 15.4 45.1 4.1s15.4-31.5 4.1-45.1L233.7 256 376.6 84.5z"})})})]}),we("div",{className:"useful-controls-content-wrapper",children:[we("p",{children:[V("kbd",{children:"RMB"}),V("br",{}),ot.ui_rmb]}),we("p",{children:[V("kbd",{children:"ALT + LMB"}),V("br",{}),ot.ui_alt_lmb]}),we("p",{children:[V("kbd",{children:"CTRL + LMB"}),V("br",{}),ot.ui_ctrl_lmb]}),we("p",{children:[V("kbd",{children:"SHIFT + Drag"}),V("br",{}),ot.ui_shift_drag]}),we("p",{children:[V("kbd",{children:"CTRL + SHIFT + LMB"}),V("br",{}),ot.ui_ctrl_shift_lmb]}),V("div",{style:{textAlign:"right"},children:"🐂"})]})]})})})})})},gz=()=>{const e=yi(b3),t=ru(),[n,r]=T.exports.useState(!1),[,i]=dg(()=>({accept:"SLOT",drop:a=>{a.inventory==="player"&&iv(a.item)}})),[,l]=dg(()=>({accept:"SLOT",drop:a=>{a.inventory==="player"&&ek(a.item)}}));return we(bn,{children:[V(hz,{infoVisible:n,setInfoVisible:r}),V("div",{className:"inventory-control",children:we("div",{className:"inventory-control-wrapper",children:[V("input",{className:"inventory-control-input",type:"number",defaultValue:e,onChange:a=>{a.target.valueAsNumber=isNaN(a.target.valueAsNumber)||a.target.valueAsNumber<0?0:Math.floor(a.target.valueAsNumber),t(y3(a.target.valueAsNumber))},min:0}),V("button",{className:"inventory-control-button",ref:i,children:ot.ui_use||"Use"}),V("button",{className:"inventory-control-button",ref:l,children:ot.ui_give||"Give"}),V("button",{className:"inventory-control-button",onClick:()=>cr("exit"),children:ot.ui_close||"Close"})]})}),V("button",{className:"useful-controls-button",onClick:()=>r(!0),children:V("svg",{xmlns:"http://www.w3.org/2000/svg",height:"2em",viewBox:"0 0 524 524",children:V("path",{d:"M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"})})})]})},rh=(e,t,n)=>{let r=e*n,i=t*(1-n);return r+i},Wa=(e,t,n)=>{let r=rh(e[0],t[0],n),i=rh(e[1],t[1],n),l=rh(e[2],t[2],n);return`rgb(${r}, ${i}, ${l})`},Pi={primaryColor:[231,76,60],secondColor:[39,174,96],accentColor:[211,84,0]},yv=({percent:e,durability:t})=>{const n=be.useMemo(()=>t?e<50?Wa(Pi.accentColor,Pi.primaryColor,e/100):Wa(Pi.secondColor,Pi.accentColor,e/100):e>50?Wa(Pi.primaryColor,Pi.accentColor,e/100):Wa(Pi.accentColor,Pi.secondColor,e/50),[t,e]);return V("div",{className:t?"durability-bar":"weight-bar",children:V("div",{style:{visibility:e>0?"visible":"hidden",height:"100%",width:`${e}%`,backgroundColor:n,transition:`background ${.3}s ease, width ${.3}s ease`}})})};function Eg(e,t){return Eg=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,i){return r.__proto__=i,r},Eg(e,t)}function xv(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,Eg(e,t)}var Se={exports:{}},mz="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",vz=mz,yz=vz;function $k(){}function Bk(){}Bk.resetWarningCache=$k;var xz=function(){function e(r,i,l,s,a,f){if(f!==yz){var d=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw d.name="Invariant Violation",d}}e.isRequired=e;function t(){return e}var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:Bk,resetWarningCache:$k};return n.PropTypes=n,n};Se.exports=xz();function wz(e,t){return e.classList?!!t&&e.classList.contains(t):(" "+(e.className.baseVal||e.className)+" ").indexOf(" "+t+" ")!==-1}function Sz(e,t){e.classList?e.classList.add(t):wz(e,t)||(typeof e.className=="string"?e.className=e.className+" "+t:e.setAttribute("class",(e.className&&e.className.baseVal||"")+" "+t))}function uw(e,t){return e.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}function Ez(e,t){e.classList?e.classList.remove(t):typeof e.className=="string"?e.className=uw(e.className,t):e.setAttribute("class",uw(e.className&&e.className.baseVal||"",t))}const sw={disabled:!1},Jc=be.createContext(null);var Uk=function(t){return t.scrollTop},zu="unmounted",ko="exited",_o="entering",ml="entered",Cg="exiting",wi=function(e){xv(t,e);function t(r,i){var l;l=e.call(this,r,i)||this;var s=i,a=s&&!s.isMounting?r.enter:r.appear,f;return l.appearStatus=null,r.in?a?(f=ko,l.appearStatus=_o):f=ml:r.unmountOnExit||r.mountOnEnter?f=zu:f=ko,l.state={status:f},l.nextCallback=null,l}t.getDerivedStateFromProps=function(i,l){var s=i.in;return s&&l.status===zu?{status:ko}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(i){var l=null;if(i!==this.props){var s=this.state.status;this.props.in?s!==_o&&s!==ml&&(l=_o):(s===_o||s===ml)&&(l=Cg)}this.updateStatus(!1,l)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var i=this.props.timeout,l,s,a;return l=s=a=i,i!=null&&typeof i!="number"&&(l=i.exit,s=i.enter,a=i.appear!==void 0?i.appear:s),{exit:l,enter:s,appear:a}},n.updateStatus=function(i,l){if(i===void 0&&(i=!1),l!==null)if(this.cancelNextCallback(),l===_o){if(this.props.unmountOnExit||this.props.mountOnEnter){var s=this.props.nodeRef?this.props.nodeRef.current:Ba.findDOMNode(this);s&&Uk(s)}this.performEnter(i)}else this.performExit();else this.props.unmountOnExit&&this.state.status===ko&&this.setState({status:zu})},n.performEnter=function(i){var l=this,s=this.props.enter,a=this.context?this.context.isMounting:i,f=this.props.nodeRef?[a]:[Ba.findDOMNode(this),a],d=f[0],h=f[1],g=this.getTimeouts(),y=a?g.appear:g.enter;if(!i&&!s||sw.disabled){this.safeSetState({status:ml},function(){l.props.onEntered(d)});return}this.props.onEnter(d,h),this.safeSetState({status:_o},function(){l.props.onEntering(d,h),l.onTransitionEnd(y,function(){l.safeSetState({status:ml},function(){l.props.onEntered(d,h)})})})},n.performExit=function(){var i=this,l=this.props.exit,s=this.getTimeouts(),a=this.props.nodeRef?void 0:Ba.findDOMNode(this);if(!l||sw.disabled){this.safeSetState({status:ko},function(){i.props.onExited(a)});return}this.props.onExit(a),this.safeSetState({status:Cg},function(){i.props.onExiting(a),i.onTransitionEnd(s.exit,function(){i.safeSetState({status:ko},function(){i.props.onExited(a)})})})},n.cancelNextCallback=function(){this.nextCallback!==null&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(i,l){l=this.setNextCallback(l),this.setState(i,l)},n.setNextCallback=function(i){var l=this,s=!0;return this.nextCallback=function(a){s&&(s=!1,l.nextCallback=null,i(a))},this.nextCallback.cancel=function(){s=!1},this.nextCallback},n.onTransitionEnd=function(i,l){this.setNextCallback(l);var s=this.props.nodeRef?this.props.nodeRef.current:Ba.findDOMNode(this),a=i==null&&!this.props.addEndListener;if(!s||a){setTimeout(this.nextCallback,0);return}if(this.props.addEndListener){var f=this.props.nodeRef?[this.nextCallback]:[s,this.nextCallback],d=f[0],h=f[1];this.props.addEndListener(d,h)}i!=null&&setTimeout(this.nextCallback,i)},n.render=function(){var i=this.state.status;if(i===zu)return null;var l=this.props,s=l.children;l.in,l.mountOnEnter,l.unmountOnExit,l.appear,l.enter,l.exit,l.timeout,l.addEndListener,l.onEnter,l.onEntering,l.onEntered,l.onExit,l.onExiting,l.onExited,l.nodeRef;var a=Am(l,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]);return be.createElement(Jc.Provider,{value:null},typeof s=="function"?s(i,a):be.cloneElement(be.Children.only(s),a))},t}(be.Component);wi.contextType=Jc;wi.propTypes={};function gl(){}wi.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:gl,onEntering:gl,onEntered:gl,onExit:gl,onExiting:gl,onExited:gl};wi.UNMOUNTED=zu;wi.EXITED=ko;wi.ENTERING=_o;wi.ENTERED=ml;wi.EXITING=Cg;const Cz=wi;var kz=function(t,n){return t&&n&&n.split(" ").forEach(function(r){return Sz(t,r)})},ih=function(t,n){return t&&n&&n.split(" ").forEach(function(r){return Ez(t,r)})},wv=function(e){xv(t,e);function t(){for(var r,i=arguments.length,l=new Array(i),s=0;s{const t=be.useRef(null);return V(Hk,{nodeRef:t,in:e.in,timeout:200,classNames:"transition-slide-up",unmountOnExit:!0,children:be.cloneElement(e.children,{ref:t})})},Dz=()=>{const[e,t]=T.exports.useState(!1),n=yi(YC).items.slice(0,5),[r,i]=T.exports.useState();return Br("toggleHotbar",()=>{e?t(!1):(r&&clearTimeout(r),t(!0),i(setTimeout(()=>t(!1),3e3)))}),V(Az,{in:e,children:V("div",{className:"hotbar-container",children:n.map(l=>V("div",{className:"hotbar-item-slot",style:{backgroundImage:`url(${l?.name?zl(l):"none"}`},children:wn(l)&&we("div",{className:"item-slot-wrapper",children:[we("div",{className:"hotbar-slot-header-wrapper",children:[V("div",{className:"inventory-slot-number",children:l.slot}),we("div",{className:"item-slot-info-wrapper",children:[V("p",{children:l.weight>0?l.weight>=1e3?`${(l.weight/1e3).toLocaleString("en-us",{minimumFractionDigits:2})}kg `:`${l.weight.toLocaleString("en-us",{minimumFractionDigits:0})}g `:""}),V("p",{children:l.count?l.count.toLocaleString("en-us")+"x":""})]})]}),we("div",{children:[l?.durability!==void 0&&V(yv,{percent:l.durability,durability:!0}),V("div",{className:"inventory-slot-label-box",children:V("div",{className:"inventory-slot-label-text",children:l.metadata?.label?l.metadata.label:ct[l.name]?.label||l.name})})]})]})},`hotbar-${l.slot}`))})})},Lz=["Escape"],Mz=e=>{const t=T.exports.useRef(KC),n=ru();T.exports.useEffect(()=>{t.current=e},[e]),T.exports.useEffect(()=>{const r=i=>{Lz.includes(i.code)&&(t.current(!1),n(Xu()),n(JC()),cr("exit"))};return window.addEventListener("keyup",r),()=>window.removeEventListener("keyup",r)},[])},Nz=Zm("inventory/validateMove",async(e,{rejectWithValue:t,dispatch:n})=>{try{const r=await cr("swapItems",e);if(r===!1)return t(r);typeof r=="number"&&n(k3(r))}catch{return t(!1)}}),kg=(e,t)=>{const{inventory:n}=Mn.getState(),{sourceInventory:r,targetInventory:i}=Wf(n,e.inventory,t?.inventory),l=r.items[e.item.slot-1],s=ct[l.name];if(s===void 0)return console.error(`${l.name} item data undefined!`);if(l.metadata?.container!==void 0){if(i.type===en.CONTAINER)return console.log(`Cannot store container ${l.name} inside another container`);if(n.rightInventory.id===l.metadata.container)return console.log(`Cannot move container ${l.name} when opened`)}const a=t?i.items[t.item.slot-1]:a3(l,s,i.items);if(a===void 0)return console.error("Target slot undefined!");if(a.metadata?.container!==void 0&&n.rightInventory.id===a.metadata.container)return console.log(`Cannot swap item ${l.name} with container ${a.name} when opened`);const f=n.shiftPressed&&l.count>1&&r.type!=="shop"?Math.floor(l.count/2):n.itemAmount===0||n.itemAmount>l.count?l.count:n.itemAmount,d={fromSlot:l,toSlot:a,fromType:r.type,toType:i.type,count:f};Mn.dispatch(Nz({...d,fromSlot:l.slot,toSlot:a.slot})),wn(a,!0)?s.stack&&s3(l,a)?Mn.dispatch(E3({...d,toSlot:a})):Mn.dispatch(w3({...d,toSlot:a})):Mn.dispatch(S3(d))},Fz=Zm("inventory/buyItem",async(e,{rejectWithValue:t})=>{try{const n=await cr("buyItem",e);if(n===!1)return t(n)}catch{return t(!1)}}),zz=(e,t)=>{const{inventory:n}=Mn.getState(),r=n.rightInventory,i=n.leftInventory,l=r.items[e.item.slot-1];if(!wn(l))throw new Error(`Item ${l.slot} name === undefined`);if(l.count===0)return;if(ct[l.name]===void 0)return console.error(`Item ${l.name} data undefined!`);const a=i.items[t.item.slot-1];if(a===void 0)return console.error("Target slot undefined");const f=n.itemAmount!==0?l.count&&n.itemAmount>l.count?l.count:n.itemAmount:1,d={fromSlot:l,toSlot:a,fromType:r.type,toType:i.type,count:f};Mn.dispatch(Fz({...d,fromSlot:l.slot,toSlot:a.slot}))},$z=Zm("inventory/craftItem",async(e,{rejectWithValue:t})=>{try{const n=await cr("craftItem",e);if(n===!1)return t(n)}catch{return t(!1)}}),Bz=(e,t)=>{const{inventory:n}=Mn.getState(),r=n.rightInventory,i=n.leftInventory,l=r.items[e.item.slot-1];if(!wn(l))throw new Error(`Item ${l.slot} name === undefined`);if(l.count===0)return;if(ct[l.name]===void 0)return console.error(`Item ${l.name} data undefined!`);const a=i.items[t.item.slot-1];if(a===void 0)return console.error("Target slot undefined");const f=n.itemAmount===0?1:n.itemAmount,d={fromSlot:l,toSlot:a,fromType:r.type,toType:i.type,count:f};Mn.dispatch($z({...d,fromSlot:l.slot,toSlot:a.slot}))},Uz=({item:e,inventoryId:t,inventoryType:n,inventoryGroups:r},i)=>{const l=vi(),s=ru(),a=T.exports.useRef(null),f=be.useCallback(()=>Fx(e,{type:n,groups:r})&&zx(e,n),[e,n,r]),[{isDragging:d},h]=oF(()=>({type:"SLOT",collect:v=>({isDragging:v.isDragging()}),item:()=>wn(e,n!==en.SHOP)?{inventory:n,item:{name:e.name,slot:e.slot},image:e?.name&&`url(${zl(e)||"none"}`}:null,canDrag:f}),[n,e]),[{isOver:g},y]=dg(()=>({accept:"SLOT",collect:v=>({isOver:v.isOver()}),drop:v=>{switch(s(Xu()),v.inventory){case en.SHOP:zz(v,{inventory:n,item:{slot:e.slot}});break;case en.CRAFTING:Bz(v,{inventory:n,item:{slot:e.slot}});break;default:kg(v,{inventory:n,item:{slot:e.slot}});break}},canDrop:v=>(v.item.slot!==e.slot||v.inventory!==n)&&n!==en.SHOP&&n!==en.CRAFTING}),[n,e]);Br("refreshSlots",v=>{!d&&!v.items||!Array.isArray(v.items)||!v.items.find(_=>_.item.slot===e.slot&&_.inventory===t)||l.dispatch({type:"dnd-core/END_DRAG"})});const m=v=>h(y(v)),w=v=>{v.preventDefault(),!(n!=="player"||!wn(e))&&s(A3({item:e,coords:{x:v.clientX,y:v.clientY}}))},E=v=>{s(Xu()),a.current&&clearTimeout(a.current),v.ctrlKey&&wn(e)&&n!=="shop"&&n!=="crafting"?kg({item:e,inventory:n}):v.altKey&&wn(e)&&n==="player"&&iv(e)},A=fv([m,i]);return V("div",{ref:A,onContextMenu:w,onClick:E,className:"inventory-slot",style:{filter:!Fx(e,{type:n,groups:r})||!zx(e,n)?"brightness(80%) grayscale(100%)":void 0,opacity:d?.4:1,backgroundImage:`url(${e?.name?zl(e):"none"}`,border:g?"1px dashed rgba(255,255,255,0.4)":""},children:wn(e)&&we("div",{className:"item-slot-wrapper",onMouseEnter:()=>{a.current=setTimeout(()=>{s(T3({item:e,inventoryType:n}))},500)},onMouseLeave:()=>{s(Xu()),a.current&&(clearTimeout(a.current),a.current=null)},children:[we("div",{className:n==="player"&&e.slot<=5?"item-hotslot-header-wrapper":"item-slot-header-wrapper",children:[n==="player"&&e.slot<=5&&V("div",{className:"inventory-slot-number",children:e.slot}),we("div",{className:"item-slot-info-wrapper",children:[V("p",{children:e.weight>0?e.weight>=1e3?`${(e.weight/1e3).toLocaleString("en-us",{minimumFractionDigits:2})}kg `:`${e.weight.toLocaleString("en-us",{minimumFractionDigits:0})}g `:""}),V("p",{children:e.count?e.count.toLocaleString("en-us")+"x":""})]})]}),we("div",{children:[n!=="shop"&&e?.durability!==void 0&&V(yv,{percent:e.durability,durability:!0}),n==="shop"&&e?.price!==void 0&&V(bn,{children:e?.currency!=="money"&&e.currency!=="black_money"&&e.price>0&&e.currency?we("div",{className:"item-slot-currency-wrapper",children:[V("img",{src:e.currency?zl(e.currency):"none",alt:"item-image",style:{imageRendering:"-webkit-optimize-contrast",height:"auto",width:"2vh",backfaceVisibility:"hidden",transform:"translateZ(0)"}}),V("p",{children:e.price.toLocaleString("en-us")})]}):V(bn,{children:e.price>0&&V("div",{className:"item-slot-price-wrapper",style:{color:e.currency==="money"||!e.currency?"#2ECC71":"#E74C3C"},children:we("p",{children:[ot.$||"$",e.price.toLocaleString("en-us")]})})})}),V("div",{className:"inventory-slot-label-box",children:V("div",{className:"inventory-slot-label-text",children:e.metadata?.label?e.metadata.label:ct[e.name]?.label||e.name})})]})]})})},Hz=be.memo(be.forwardRef(Uz));function jz(e){const[t,n]=T.exports.useState(null),r=T.exports.useRef(null);return{ref:T.exports.useCallback(l=>{if(r.current&&(r.current.disconnect(),r.current=null),l===null){n(null);return}r.current=new IntersectionObserver(([s])=>{n(s)},e),r.current.observe(l)},[e?.rootMargin,e?.root,e?.threshold]),entry:t}}const aw=30,jk=({inventory:e})=>{const t=be.useMemo(()=>e.maxWeight!==void 0?Math.floor(c3(e.items)*1e3)/1e3:0,[e.maxWeight,e.items]),[n,r]=be.useState(0),i=T.exports.useRef(null),{ref:l,entry:s}=jz({threshold:.5}),a=yi(f=>f.inventory.isBusy);return be.useEffect(()=>{s&&s.isIntersecting&&r(f=>++f)},[s]),V(bn,{children:we("div",{className:"inventory-grid-wrapper",style:{pointerEvents:a?"none":"auto"},children:[we("div",{children:[we("div",{className:"inventory-grid-header-wrapper",children:[V("p",{children:e.label}),e.maxWeight&&we("p",{children:[t/1e3,"/",e.maxWeight/1e3,"kg"]})]}),V(yv,{percent:e.maxWeight?t/e.maxWeight*100:0})]}),V("div",{className:"inventory-grid-container",ref:i,children:V(bn,{children:e.items.slice(0,(n+1)*aw).map((f,d)=>V(Hz,{item:f,ref:d===(n+1)*aw-1?l:null,inventoryType:e.type,inventoryGroups:e.groups,inventoryId:e.id},`${e.type}-${e.id}-${f.slot}`))})})]})})},Wz=()=>{const e=yi(_3);return V(jk,{inventory:e})},Vz=()=>{const e=yi(YC);return V(jk,{inventory:e})},cw=["http","https","mailto","tel"];function qz(e){const t=(e||"").trim(),n=t.charAt(0);if(n==="#"||n==="/")return t;const r=t.indexOf(":");if(r===-1)return t;let i=-1;for(;++ii||(i=t.indexOf("#"),i!==-1&&r>i)?t:"javascript:void(0)"}var Wk=function(t){return t!=null&&t.constructor!=null&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)};function es(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?fw(e.position):"start"in e||"end"in e?fw(e):"line"in e||"column"in e?_g(e):""}function _g(e){return dw(e&&e.line)+":"+dw(e&&e.column)}function fw(e){return _g(e&&e.start)+"-"+_g(e&&e.end)}function dw(e){return e&&typeof e=="number"?e:1}class gr extends Error{constructor(t,n,r){const i=[null,null];let l={start:{line:null,column:null},end:{line:null,column:null}};if(super(),typeof n=="string"&&(r=n,n=void 0),typeof r=="string"){const s=r.indexOf(":");s===-1?i[1]=r:(i[0]=r.slice(0,s),i[1]=r.slice(s+1))}n&&("type"in n||"position"in n?n.position&&(l=n.position):"start"in n||"end"in n?l=n:("line"in n||"column"in n)&&(l.start=n)),this.name=es(n)||"1:1",this.message=typeof t=="object"?t.message:t,this.stack="",typeof t=="object"&&t.stack&&(this.stack=t.stack),this.reason=this.message,this.fatal,this.line=l.start.line,this.column=l.start.column,this.position=l,this.source=i[0],this.ruleId=i[1],this.file,this.actual,this.expected,this.url,this.note}}gr.prototype.file="";gr.prototype.name="";gr.prototype.reason="";gr.prototype.message="";gr.prototype.stack="";gr.prototype.fatal=null;gr.prototype.column=null;gr.prototype.line=null;gr.prototype.source=null;gr.prototype.ruleId=null;gr.prototype.position=null;const zr={basename:Gz,dirname:Kz,extname:Qz,join:Yz,sep:"/"};function Gz(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');Ds(e);let n=0,r=-1,i=e.length,l;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.charCodeAt(i)===47){if(l){n=i+1;break}}else r<0&&(l=!0,r=i+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let s=-1,a=t.length-1;for(;i--;)if(e.charCodeAt(i)===47){if(l){n=i+1;break}}else s<0&&(l=!0,s=i+1),a>-1&&(e.charCodeAt(i)===t.charCodeAt(a--)?a<0&&(r=i):(a=-1,r=s));return n===r?r=s:r<0&&(r=e.length),e.slice(n,r)}function Kz(e){if(Ds(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.charCodeAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.charCodeAt(0)===47?"/":".":t===1&&e.charCodeAt(0)===47?"//":e.slice(0,t)}function Qz(e){Ds(e);let t=e.length,n=-1,r=0,i=-1,l=0,s;for(;t--;){const a=e.charCodeAt(t);if(a===47){if(s){r=t+1;break}continue}n<0&&(s=!0,n=t+1),a===46?i<0?i=t:l!==1&&(l=1):i>-1&&(l=-1)}return i<0||n<0||l===0||l===1&&i===n-1&&i===r+1?"":e.slice(i,n)}function Yz(...e){let t=-1,n;for(;++t0&&e.charCodeAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function Zz(e,t){let n="",r=0,i=-1,l=0,s=-1,a,f;for(;++s<=e.length;){if(s2){if(f=n.lastIndexOf("/"),f!==n.length-1){f<0?(n="",r=0):(n=n.slice(0,f),r=n.length-1-n.lastIndexOf("/")),i=s,l=0;continue}}else if(n.length>0){n="",r=0,i=s,l=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(i+1,s):n=e.slice(i+1,s),r=s-i-1;i=s,l=0}else a===46&&l>-1?l++:l=-1}return n}function Ds(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Jz={cwd:e6};function e6(){return"/"}function bg(e){return e!==null&&typeof e=="object"&&e.href&&e.origin}function t6(e){if(typeof e=="string")e=new URL(e);else if(!bg(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return n6(e)}function n6(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n"u"||sc.call(t,i)},xw=function(t,n){gw&&n.name==="__proto__"?gw(t,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):t[n.name]=n.newValue},ww=function(t,n){if(n==="__proto__")if(sc.call(t,n)){if(mw)return mw(t,n).value}else return;return t[n]},Sw=function e(){var t,n,r,i,l,s,a=arguments[0],f=1,d=arguments.length,h=!1;for(typeof a=="boolean"&&(h=a,a=arguments[1]||{},f=2),(a==null||typeof a!="object"&&typeof a!="function")&&(a={});fs.length;let f;a&&s.push(i);try{f=e.apply(this,s)}catch(d){const h=d;if(a&&n)throw h;return i(h)}a||(f instanceof Promise?f.then(l,i):f instanceof Error?i(f):l(f))}function i(s,...a){n||(n=!0,t(s,...a))}function l(s){i(null,s)}}const o6=Kk().freeze(),Gk={}.hasOwnProperty;function Kk(){const e=r6(),t=[];let n={},r,i=-1;return l.data=s,l.Parser=void 0,l.Compiler=void 0,l.freeze=a,l.attachers=t,l.use=f,l.parse=d,l.stringify=h,l.run=g,l.runSync=y,l.process=m,l.processSync=w,l;function l(){const E=Kk();let A=-1;for(;++A{if(R||!F||!z)D(R);else{const q=l.stringify(F,z);q==null||(s6(q)?z.value=q:z.result=q),D(R,z)}});function D(R,F){R||!F?_(R):S?S(F):A(null,F)}}}function w(E){let A;l.freeze(),sh("processSync",l.Parser),ah("processSync",l.Compiler);const v=Au(E);return l.process(v,S),kw("processSync","process",A),v;function S(_){A=!0,hw(_)}}}function Ew(e,t){return typeof e=="function"&&e.prototype&&(l6(e.prototype)||t in e.prototype)}function l6(e){let t;for(t in e)if(Gk.call(e,t))return!0;return!1}function sh(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `Parser`")}function ah(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `Compiler`")}function ch(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Cw(e){if(!Og(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function kw(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function Au(e){return u6(e)?e:new Vk(e)}function u6(e){return Boolean(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function s6(e){return typeof e=="string"||Wk(e)}function a6(e,t){var{includeImageAlt:n=!0}=t||{};return Qk(e,n)}function Qk(e,t){return e&&typeof e=="object"&&(e.value||(t?e.alt:"")||"children"in e&&_w(e.children,t)||Array.isArray(e)&&_w(e,t))||""}function _w(e,t){for(var n=[],r=-1;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)s=Array.from(r),s.unshift(t,n),[].splice.apply(e,s);else for(n&&[].splice.apply(e,[t,n]);l0?(Vr(e,e.length,0,t),e):t}const bw={}.hasOwnProperty;function c6(e){const t={};let n=-1;for(;++ns))return;const F=t.events.length;let z=F,q,K;for(;z--;)if(t.events[z][0]==="exit"&&t.events[z][1].type==="chunkFlow"){if(q){K=t.events[z][1].end;break}q=!0}for(v(r),R=F;R_;){const D=n[P];t.containerState=D[1],D[0].exit.call(t,e)}n.length=_}function S(){i.write([null]),l=void 0,i=void 0,t.containerState._closeFlow=void 0}}function E6(e,t,n){return Je(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Tw(e){if(e===null||fr(e)||m6(e))return 1;if(v6(e))return 2}function Cv(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const g=Object.assign({},e[r][1].end),y=Object.assign({},e[n][1].start);Rw(g,-f),Rw(y,f),s={type:f>1?"strongSequence":"emphasisSequence",start:g,end:Object.assign({},e[r][1].end)},a={type:f>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[n][1].start),end:y},l={type:f>1?"strongText":"emphasisText",start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},i={type:f>1?"strong":"emphasis",start:Object.assign({},s.start),end:Object.assign({},a.end)},e[r][1].end=Object.assign({},s.start),e[n][1].start=Object.assign({},a.end),d=[],e[r][1].end.offset-e[r][1].start.offset&&(d=ur(d,[["enter",e[r][1],t],["exit",e[r][1],t]])),d=ur(d,[["enter",i,t],["enter",s,t],["exit",s,t],["enter",l,t]]),d=ur(d,Cv(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),d=ur(d,[["exit",l,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(h=2,d=ur(d,[["enter",e[n][1],t],["exit",e[n][1],t]])):h=0,Vr(e,r-1,n-r+3,d),n=r+d.length-h-2;break}}for(n=-1;++n=4?s(d):n(d)}function s(d){return d===null?f(d):Ee(d)?e.attempt(L6,s,f)(d):(e.enter("codeFlowValue"),a(d))}function a(d){return d===null||Ee(d)?(e.exit("codeFlowValue"),s(d)):(e.consume(d),a)}function f(d){return e.exit("codeIndented"),t(d)}}function N6(e,t,n){const r=this;return i;function i(s){return r.parser.lazy[r.now().line]?n(s):Ee(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),i):Je(e,l,"linePrefix",4+1)(s)}function l(s){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(s):Ee(s)?i(s):n(s)}}const F6={name:"codeText",tokenize:B6,resolve:z6,previous:$6};function z6(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=4?t(s):e.interrupt(r.parser.constructs.flow,n,t)(s)}}function e_(e,t,n,r,i,l,s,a,f){const d=f||Number.POSITIVE_INFINITY;let h=0;return g;function g(v){return v===60?(e.enter(r),e.enter(i),e.enter(l),e.consume(v),e.exit(l),y):v===null||v===41||Tg(v)?n(v):(e.enter(r),e.enter(s),e.enter(a),e.enter("chunkString",{contentType:"string"}),E(v))}function y(v){return v===62?(e.enter(l),e.consume(v),e.exit(l),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),m(v))}function m(v){return v===62?(e.exit("chunkString"),e.exit(a),y(v)):v===null||v===60||Ee(v)?n(v):(e.consume(v),v===92?w:m)}function w(v){return v===60||v===62||v===92?(e.consume(v),m):m(v)}function E(v){return v===40?++h>d?n(v):(e.consume(v),E):v===41?h--?(e.consume(v),E):(e.exit("chunkString"),e.exit(a),e.exit(s),e.exit(r),t(v)):v===null||fr(v)?h?n(v):(e.exit("chunkString"),e.exit(a),e.exit(s),e.exit(r),t(v)):Tg(v)?n(v):(e.consume(v),v===92?A:E)}function A(v){return v===40||v===41||v===92?(e.consume(v),E):E(v)}}function t_(e,t,n,r,i,l){const s=this;let a=0,f;return d;function d(m){return e.enter(r),e.enter(i),e.consume(m),e.exit(i),e.enter(l),h}function h(m){return m===null||m===91||m===93&&!f||m===94&&!a&&"_hiddenFootnoteSupport"in s.parser.constructs||a>999?n(m):m===93?(e.exit(l),e.enter(i),e.consume(m),e.exit(i),e.exit(r),t):Ee(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),h):(e.enter("chunkString",{contentType:"string"}),g(m))}function g(m){return m===null||m===91||m===93||Ee(m)||a++>999?(e.exit("chunkString"),h(m)):(e.consume(m),f=f||!bt(m),m===92?y:g)}function y(m){return m===91||m===92||m===93?(e.consume(m),a++,g):g(m)}}function n_(e,t,n,r,i,l){let s;return a;function a(y){return e.enter(r),e.enter(i),e.consume(y),e.exit(i),s=y===40?41:y,f}function f(y){return y===s?(e.enter(i),e.consume(y),e.exit(i),e.exit(r),t):(e.enter(l),d(y))}function d(y){return y===s?(e.exit(l),f(s)):y===null?n(y):Ee(y)?(e.enter("lineEnding"),e.consume(y),e.exit("lineEnding"),Je(e,d,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===s||y===null||Ee(y)?(e.exit("chunkString"),d(y)):(e.consume(y),y===92?g:h)}function g(y){return y===s||y===92?(e.consume(y),h):h(y)}}function ts(e,t){let n;return r;function r(i){return Ee(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):bt(i)?Je(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}function Bl(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const G6={name:"definition",tokenize:Q6},K6={tokenize:Y6,partial:!0};function Q6(e,t,n){const r=this;let i;return l;function l(f){return e.enter("definition"),t_.call(r,e,s,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(f)}function s(f){return i=Bl(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),f===58?(e.enter("definitionMarker"),e.consume(f),e.exit("definitionMarker"),ts(e,e_(e,e.attempt(K6,Je(e,a,"whitespace"),Je(e,a,"whitespace")),n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString"))):n(f)}function a(f){return f===null||Ee(f)?(e.exit("definition"),r.parser.defined.includes(i)||r.parser.defined.push(i),t(f)):n(f)}}function Y6(e,t,n){return r;function r(s){return fr(s)?ts(e,i)(s):n(s)}function i(s){return s===34||s===39||s===40?n_(e,Je(e,l,"whitespace"),n,"definitionTitle","definitionTitleMarker","definitionTitleString")(s):n(s)}function l(s){return s===null||Ee(s)?t(s):n(s)}}const X6={name:"hardBreakEscape",tokenize:Z6};function Z6(e,t,n){return r;function r(l){return e.enter("hardBreakEscape"),e.enter("escapeMarker"),e.consume(l),i}function i(l){return Ee(l)?(e.exit("escapeMarker"),e.exit("hardBreakEscape"),t(l)):n(l)}}const J6={name:"headingAtx",tokenize:t5,resolve:e5};function e5(e,t){let n=e.length-2,r=3,i,l;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},l={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},Vr(e,r,n-r+1,[["enter",i,t],["enter",l,t],["exit",l,t],["exit",i,t]])),e}function t5(e,t,n){const r=this;let i=0;return l;function l(h){return e.enter("atxHeading"),e.enter("atxHeadingSequence"),s(h)}function s(h){return h===35&&i++<6?(e.consume(h),s):h===null||fr(h)?(e.exit("atxHeadingSequence"),r.interrupt?t(h):a(h)):n(h)}function a(h){return h===35?(e.enter("atxHeadingSequence"),f(h)):h===null||Ee(h)?(e.exit("atxHeading"),t(h)):bt(h)?Je(e,a,"whitespace")(h):(e.enter("atxHeadingText"),d(h))}function f(h){return h===35?(e.consume(h),f):(e.exit("atxHeadingSequence"),a(h))}function d(h){return h===null||h===35||fr(h)?(e.exit("atxHeadingText"),a(h)):(e.consume(h),d)}}const n5=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Dw=["pre","script","style","textarea"],r5={name:"htmlFlow",tokenize:l5,resolveTo:o5,concrete:!0},i5={tokenize:u5,partial:!0};function o5(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function l5(e,t,n){const r=this;let i,l,s,a,f;return d;function d(O){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(O),h}function h(O){return O===33?(e.consume(O),g):O===47?(e.consume(O),w):O===63?(e.consume(O),i=3,r.interrupt?t:J):Ur(O)?(e.consume(O),s=String.fromCharCode(O),l=!0,E):n(O)}function g(O){return O===45?(e.consume(O),i=2,y):O===91?(e.consume(O),i=5,s="CDATA[",a=0,m):Ur(O)?(e.consume(O),i=4,r.interrupt?t:J):n(O)}function y(O){return O===45?(e.consume(O),r.interrupt?t:J):n(O)}function m(O){return O===s.charCodeAt(a++)?(e.consume(O),a===s.length?r.interrupt?t:B:m):n(O)}function w(O){return Ur(O)?(e.consume(O),s=String.fromCharCode(O),E):n(O)}function E(O){return O===null||O===47||O===62||fr(O)?O!==47&&l&&Dw.includes(s.toLowerCase())?(i=1,r.interrupt?t(O):B(O)):n5.includes(s.toLowerCase())?(i=6,O===47?(e.consume(O),A):r.interrupt?t(O):B(O)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(O):l?S(O):v(O)):O===45||Fn(O)?(e.consume(O),s+=String.fromCharCode(O),E):n(O)}function A(O){return O===62?(e.consume(O),r.interrupt?t:B):n(O)}function v(O){return bt(O)?(e.consume(O),v):q(O)}function S(O){return O===47?(e.consume(O),q):O===58||O===95||Ur(O)?(e.consume(O),_):bt(O)?(e.consume(O),S):q(O)}function _(O){return O===45||O===46||O===58||O===95||Fn(O)?(e.consume(O),_):P(O)}function P(O){return O===61?(e.consume(O),D):bt(O)?(e.consume(O),P):S(O)}function D(O){return O===null||O===60||O===61||O===62||O===96?n(O):O===34||O===39?(e.consume(O),f=O,R):bt(O)?(e.consume(O),D):(f=null,F(O))}function R(O){return O===null||Ee(O)?n(O):O===f?(e.consume(O),z):(e.consume(O),R)}function F(O){return O===null||O===34||O===39||O===60||O===61||O===62||O===96||fr(O)?P(O):(e.consume(O),F)}function z(O){return O===47||O===62||bt(O)?S(O):n(O)}function q(O){return O===62?(e.consume(O),K):n(O)}function K(O){return bt(O)?(e.consume(O),K):O===null||Ee(O)?B(O):n(O)}function B(O){return O===45&&i===2?(e.consume(O),ie):O===60&&i===1?(e.consume(O),oe):O===62&&i===4?(e.consume(O),ee):O===63&&i===3?(e.consume(O),J):O===93&&i===5?(e.consume(O),U):Ee(O)&&(i===6||i===7)?e.check(i5,ee,X)(O):O===null||Ee(O)?X(O):(e.consume(O),B)}function X(O){return e.exit("htmlFlowData"),$(O)}function $(O){return O===null?b(O):Ee(O)?e.attempt({tokenize:H,partial:!0},$,b)(O):(e.enter("htmlFlowData"),B(O))}function H(O,fe,ve){return Ae;function Ae(Oe){return O.enter("lineEnding"),O.consume(Oe),O.exit("lineEnding"),de}function de(Oe){return r.parser.lazy[r.now().line]?ve(Oe):fe(Oe)}}function ie(O){return O===45?(e.consume(O),J):B(O)}function oe(O){return O===47?(e.consume(O),s="",ue):B(O)}function ue(O){return O===62&&Dw.includes(s.toLowerCase())?(e.consume(O),ee):Ur(O)&&s.length<8?(e.consume(O),s+=String.fromCharCode(O),ue):B(O)}function U(O){return O===93?(e.consume(O),J):B(O)}function J(O){return O===62?(e.consume(O),ee):O===45&&i===2?(e.consume(O),J):B(O)}function ee(O){return O===null||Ee(O)?(e.exit("htmlFlowData"),b(O)):(e.consume(O),ee)}function b(O){return e.exit("htmlFlow"),t(O)}}function u5(e,t,n){return r;function r(i){return e.exit("htmlFlowData"),e.enter("lineEndingBlank"),e.consume(i),e.exit("lineEndingBlank"),e.attempt(Xf,t,n)}}const s5={name:"htmlText",tokenize:a5};function a5(e,t,n){const r=this;let i,l,s,a;return f;function f(b){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(b),d}function d(b){return b===33?(e.consume(b),h):b===47?(e.consume(b),F):b===63?(e.consume(b),D):Ur(b)?(e.consume(b),K):n(b)}function h(b){return b===45?(e.consume(b),g):b===91?(e.consume(b),l="CDATA[",s=0,A):Ur(b)?(e.consume(b),P):n(b)}function g(b){return b===45?(e.consume(b),y):n(b)}function y(b){return b===null||b===62?n(b):b===45?(e.consume(b),m):w(b)}function m(b){return b===null||b===62?n(b):w(b)}function w(b){return b===null?n(b):b===45?(e.consume(b),E):Ee(b)?(a=w,U(b)):(e.consume(b),w)}function E(b){return b===45?(e.consume(b),ee):w(b)}function A(b){return b===l.charCodeAt(s++)?(e.consume(b),s===l.length?v:A):n(b)}function v(b){return b===null?n(b):b===93?(e.consume(b),S):Ee(b)?(a=v,U(b)):(e.consume(b),v)}function S(b){return b===93?(e.consume(b),_):v(b)}function _(b){return b===62?ee(b):b===93?(e.consume(b),_):v(b)}function P(b){return b===null||b===62?ee(b):Ee(b)?(a=P,U(b)):(e.consume(b),P)}function D(b){return b===null?n(b):b===63?(e.consume(b),R):Ee(b)?(a=D,U(b)):(e.consume(b),D)}function R(b){return b===62?ee(b):D(b)}function F(b){return Ur(b)?(e.consume(b),z):n(b)}function z(b){return b===45||Fn(b)?(e.consume(b),z):q(b)}function q(b){return Ee(b)?(a=q,U(b)):bt(b)?(e.consume(b),q):ee(b)}function K(b){return b===45||Fn(b)?(e.consume(b),K):b===47||b===62||fr(b)?B(b):n(b)}function B(b){return b===47?(e.consume(b),ee):b===58||b===95||Ur(b)?(e.consume(b),X):Ee(b)?(a=B,U(b)):bt(b)?(e.consume(b),B):ee(b)}function X(b){return b===45||b===46||b===58||b===95||Fn(b)?(e.consume(b),X):$(b)}function $(b){return b===61?(e.consume(b),H):Ee(b)?(a=$,U(b)):bt(b)?(e.consume(b),$):B(b)}function H(b){return b===null||b===60||b===61||b===62||b===96?n(b):b===34||b===39?(e.consume(b),i=b,ie):Ee(b)?(a=H,U(b)):bt(b)?(e.consume(b),H):(e.consume(b),i=void 0,ue)}function ie(b){return b===i?(e.consume(b),oe):b===null?n(b):Ee(b)?(a=ie,U(b)):(e.consume(b),ie)}function oe(b){return b===62||b===47||fr(b)?B(b):n(b)}function ue(b){return b===null||b===34||b===39||b===60||b===61||b===96?n(b):b===62||fr(b)?B(b):(e.consume(b),ue)}function U(b){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(b),e.exit("lineEnding"),Je(e,J,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function J(b){return e.enter("htmlTextData"),a(b)}function ee(b){return b===62?(e.consume(b),e.exit("htmlTextData"),e.exit("htmlText"),t):n(b)}}const _v={name:"labelEnd",tokenize:g5,resolveTo:h5,resolveAll:p5},c5={tokenize:m5},f5={tokenize:v5},d5={tokenize:y5};function p5(e){let t=-1,n;for(;++t-1&&(s[0]=s[0].slice(r)),l>0&&s.push(e[i].slice(0,l))),s}function H5(e,t){let n=-1;const r=[];let i;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCharCode(n)}const n$=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function r$(e){return e.replace(n$,i$)}function i$(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const i=n.charCodeAt(1),l=i===120||i===88;return o_(n.slice(l?2:1),l?16:10)}return kv(n)||e}const Pg={}.hasOwnProperty,o$=function(e,t,n){return typeof t!="string"&&(n=t,t=void 0),l$(n)(t$(J5(n).document().write(e$()(e,t,!0))))};function l$(e={}){const t=l_({transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:f(Vt),autolinkProtocol:X,autolinkEmail:X,atxHeading:f(ut),blockQuote:f($e),characterEscape:X,characterReference:X,codeFenced:f(We),codeFencedFenceInfo:d,codeFencedFenceMeta:d,codeIndented:f(We,d),codeText:f(yt,d),codeTextData:X,data:X,codeFlowValue:X,definition:f(qn),definitionDestinationString:d,definitionLabelString:d,definitionTitleString:d,emphasis:f(he),hardBreakEscape:f(zt),hardBreakTrailing:f(zt),htmlFlow:f(pn,d),htmlFlowData:X,htmlText:f(pn,d),htmlTextData:X,image:f(Gn),label:d,link:f(Vt),listItem:f(qr),listItemValue:E,listOrdered:f(vr,w),listUnordered:f(vr),paragraph:f(Yo),reference:de,referenceString:d,resourceDestinationString:d,resourceTitleString:d,setextHeading:f(ut),strong:f(Pr),thematicBreak:f(Qn)},exit:{atxHeading:g(),atxHeadingSequence:z,autolink:g(),autolinkEmail:Ue,autolinkProtocol:Te,blockQuote:g(),characterEscapeValue:$,characterReferenceMarkerHexadecimal:ye,characterReferenceMarkerNumeric:ye,characterReferenceValue:Fe,codeFenced:g(_),codeFencedFence:S,codeFencedFenceInfo:A,codeFencedFenceMeta:v,codeFlowValue:$,codeIndented:g(P),codeText:g(U),codeTextData:$,data:$,definition:g(),definitionDestinationString:F,definitionLabelString:D,definitionTitleString:R,emphasis:g(),hardBreakEscape:g(ie),hardBreakTrailing:g(ie),htmlFlow:g(oe),htmlFlowData:$,htmlText:g(ue),htmlTextData:$,image:g(ee),label:O,labelText:b,lineEnding:H,link:g(J),listItem:g(),listOrdered:g(),listUnordered:g(),paragraph:g(),referenceString:Oe,resourceDestinationString:fe,resourceTitleString:ve,resource:Ae,setextHeading:g(B),setextHeadingLineSequence:K,setextHeadingText:q,strong:g(),thematicBreak:g()}},e.mdastExtensions||[]),n={};return r;function r(W){let re={type:"root",children:[]};const xe=[re],He=[],qt=[],Gr={stack:xe,tokenStack:He,config:t,enter:h,exit:y,buffer:d,resume:m,setData:l,getData:s};let qe=-1;for(;++qe0){const St=He[He.length-1];(St[1]||Nw).call(Gr,void 0,St[0])}for(re.position={start:a(W.length>0?W[0][1].start:{line:1,column:1,offset:0}),end:a(W.length>0?W[W.length-2][1].end:{line:1,column:1,offset:0})},qe=-1;++qe{const r=this.data("settings");return o$(n,Object.assign({},r,e,{extensions:this.data("micromarkExtensions")||[],mdastExtensions:this.data("fromMarkdownExtensions")||[]}))}})}var At=function(e,t,n){var r={type:String(e)};return n==null&&(typeof t=="string"||Array.isArray(t))?n=t:Object.assign(r,t),Array.isArray(n)?r.children=n:n!=null&&(r.value=String(n)),r};const cc={}.hasOwnProperty;function a$(e,t){const n=t.data||{};return"value"in t&&!(cc.call(n,"hName")||cc.call(n,"hProperties")||cc.call(n,"hChildren"))?e.augment(t,At("text",t.value)):e(t,"div",rn(e,t))}function u_(e,t,n){const r=t&&t.type;let i;if(!r)throw new Error("Expected node, got `"+t+"`");return cc.call(e.handlers,r)?i=e.handlers[r]:e.passThrough&&e.passThrough.includes(r)?i=c$:i=e.unknownHandler,(typeof i=="function"?i:a$)(e,t,n)}function c$(e,t){return"children"in t?{...t,children:rn(e,t)}:t}function rn(e,t){const n=[];if("children"in t){const r=t.children;let i=-1;for(;++i":""))+")"})),y;function y(){let m=[],w,E,A;if((!t||i(a,f,d[d.length-1]||null))&&(m=y$(n(a,d)),m[0]===Fw))return m;if(a.children&&m[0]!==m$)for(E=(r?a.children.length:-1)+l,A=d.concat(a);E>-1&&E-1?r.offset:null}}}function x$(e){return!e||!e.position||!e.position.start||!e.position.start.line||!e.position.start.column||!e.position.end||!e.position.end.line||!e.position.end.column}const zw={}.hasOwnProperty;function w$(e){const t=Object.create(null);if(!e||!e.type)throw new Error("mdast-util-definitions expected node");return bv(e,"definition",r=>{const i=$w(r.identifier);i&&!zw.call(t,i)&&(t[i]=r)}),n;function n(r){const i=$w(r);return i&&zw.call(t,i)?t[i]:null}}function $w(e){return String(e||"").toUpperCase()}function iu(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&l<57344){const a=e.charCodeAt(n+1);l<56320&&a>56319&&a<57344?(s=String.fromCharCode(l,a),i=1):s="�"}else s=String.fromCharCode(l);s&&(t.push(e.slice(r,n),encodeURIComponent(s)),r=n+i+1,s=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function ai(e,t){const n=[];let r=-1;for(t&&n.push(At("text",` +`));++r0&&n.push(At("text",` +`)),n}function S$(e){let t=-1;const n=[];for(;++t1?"-"+a:""),dataFootnoteBackref:!0,className:["data-footnote-backref"],ariaLabel:e.footnoteBackLabel},children:[{type:"text",value:"↩"}]};a>1&&g.children.push({type:"element",tagName:"sup",children:[{type:"text",value:String(a)}]}),f.length>0&&f.push({type:"text",value:" "}),f.push(g)}const d=i[i.length-1];if(d&&d.type==="element"&&d.tagName==="p"){const g=d.children[d.children.length-1];g&&g.type==="text"?g.value+=" ":d.children.push({type:"text",value:" "}),d.children.push(...f)}else i.push(...f);const h={type:"element",tagName:"li",properties:{id:e.clobberPrefix+"fn-"+s},children:ai(i,!0)};r.position&&(h.position=r.position),n.push(h)}return n.length===0?null:{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:e.footnoteLabelTagName,properties:{...JSON.parse(JSON.stringify(e.footnoteLabelProperties)),id:"footnote-label"},children:[At("text",e.footnoteLabel)]},{type:"text",value:` +`},{type:"element",tagName:"ol",properties:{},children:ai(n,!0)},{type:"text",value:` +`}]}}function E$(e,t){return e(t,"blockquote",ai(rn(e,t),!0))}function C$(e,t){return[e(t,"br"),At("text",` +`)]}function k$(e,t){const n=t.value?t.value+` +`:"",r=t.lang&&t.lang.match(/^[^ \t]+(?=[ \t]|$)/),i={};r&&(i.className=["language-"+r]);const l=e(t,"code",i,[At("text",n)]);return t.meta&&(l.data={meta:t.meta}),e(t.position,"pre",[l])}function _$(e,t){return e(t,"del",rn(e,t))}function b$(e,t){return e(t,"em",rn(e,t))}function d_(e,t){const n=String(t.identifier),r=iu(n.toLowerCase()),i=e.footnoteOrder.indexOf(n);let l;i===-1?(e.footnoteOrder.push(n),e.footnoteCounts[n]=1,l=e.footnoteOrder.length):(e.footnoteCounts[n]++,l=i+1);const s=e.footnoteCounts[n];return e(t,"sup",[e(t.position,"a",{href:"#"+e.clobberPrefix+"fn-"+r,id:e.clobberPrefix+"fnref-"+r+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:"footnote-label"},[At("text",String(l))])])}function O$(e,t){const n=e.footnoteById;let r=1;for(;r in n;)r++;const i=String(r);return n[i]={type:"footnoteDefinition",identifier:i,children:[{type:"paragraph",children:t.children}],position:t.position},d_(e,{type:"footnoteReference",identifier:i,position:t.position})}function I$(e,t){return e(t,"h"+t.depth,rn(e,t))}function T$(e,t){return e.dangerous?e.augment(t,At("raw",t.value)):null}function p_(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return At("text","!["+t.alt+r);const i=rn(e,t),l=i[0];l&&l.type==="text"?l.value="["+l.value:i.unshift(At("text","["));const s=i[i.length-1];return s&&s.type==="text"?s.value+=r:i.push(At("text",r)),i}function R$(e,t){const n=e.definition(t.identifier);if(!n)return p_(e,t);const r={src:iu(n.url||""),alt:t.alt};return n.title!==null&&n.title!==void 0&&(r.title=n.title),e(t,"img",r)}function P$(e,t){const n={src:iu(t.url),alt:t.alt};return t.title!==null&&t.title!==void 0&&(n.title=t.title),e(t,"img",n)}function A$(e,t){return e(t,"code",[At("text",t.value.replace(/\r?\n|\r/g," "))])}function D$(e,t){const n=e.definition(t.identifier);if(!n)return p_(e,t);const r={href:iu(n.url||"")};return n.title!==null&&n.title!==void 0&&(r.title=n.title),e(t,"a",r,rn(e,t))}function L$(e,t){const n={href:iu(t.url)};return t.title!==null&&t.title!==void 0&&(n.title=t.title),e(t,"a",n,rn(e,t))}function M$(e,t,n){const r=rn(e,t),i=n?N$(n):h_(t),l={},s=[];if(typeof t.checked=="boolean"){let d;r[0]&&r[0].type==="element"&&r[0].tagName==="p"?d=r[0]:(d=e(null,"p",[]),r.unshift(d)),d.children.length>0&&d.children.unshift(At("text"," ")),d.children.unshift(e(null,"input",{type:"checkbox",checked:t.checked,disabled:!0})),l.className=["task-list-item"]}let a=-1;for(;++a1}function F$(e,t){const n={},r=t.ordered?"ol":"ul",i=rn(e,t);let l=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++l0,!0),r[0]),i=r.index+r[0].length,r=n.exec(t);return l.push(Hw(t.slice(i),i>0,!1)),l.join("")}function Hw(e,t,n){let r=0,i=e.length;if(t){let l=e.codePointAt(r);for(;l===Bw||l===Uw;)r++,l=e.codePointAt(r)}if(n){let l=e.codePointAt(i-1);for(;l===Bw||l===Uw;)i--,l=e.codePointAt(i-1)}return i>r?e.slice(r,i):""}function j$(e,t){return e.augment(t,At("text",H$(String(t.value))))}function W$(e,t){return e(t,"hr")}const V$={blockquote:E$,break:C$,code:k$,delete:_$,emphasis:b$,footnoteReference:d_,footnote:O$,heading:I$,html:T$,imageReference:R$,image:P$,inlineCode:A$,linkReference:D$,link:L$,listItem:M$,list:F$,paragraph:z$,root:$$,strong:B$,table:U$,text:j$,thematicBreak:W$,toml:Va,yaml:Va,definition:Va,footnoteDefinition:Va};function Va(){return null}const q$={}.hasOwnProperty;function G$(e,t){const n=t||{},r=n.allowDangerousHtml||!1,i={};return s.dangerous=r,s.clobberPrefix=n.clobberPrefix===void 0||n.clobberPrefix===null?"user-content-":n.clobberPrefix,s.footnoteLabel=n.footnoteLabel||"Footnotes",s.footnoteLabelTagName=n.footnoteLabelTagName||"h2",s.footnoteLabelProperties=n.footnoteLabelProperties||{className:["sr-only"]},s.footnoteBackLabel=n.footnoteBackLabel||"Back to content",s.definition=w$(e),s.footnoteById=i,s.footnoteOrder=[],s.footnoteCounts={},s.augment=l,s.handlers={...V$,...n.handlers},s.unknownHandler=n.unknownHandler,s.passThrough=n.passThrough,bv(e,"footnoteDefinition",a=>{const f=String(a.identifier).toUpperCase();q$.call(i,f)||(i[f]=a)}),s;function l(a,f){if(a&&"data"in a&&a.data){const d=a.data;d.hName&&(f.type!=="element"&&(f={type:"element",tagName:"",properties:{},children:[]}),f.tagName=d.hName),f.type==="element"&&d.hProperties&&(f.properties={...f.properties,...d.hProperties}),"children"in f&&f.children&&d.hChildren&&(f.children=d.hChildren)}if(a){const d="type"in a?a:{position:a};x$(d)||(f.position={start:a_(d),end:c_(d)})}return f}function s(a,f,d,h){return Array.isArray(d)&&(h=d,d={}),l(a,{type:"element",tagName:f,properties:d||{},children:h||[]})}}function g_(e,t){const n=G$(e,t),r=u_(n,e,null),i=S$(n);return i&&r.children.push(At("text",` +`),i),Array.isArray(r)?{type:"root",children:r}:r}const K$=function(e,t){return e&&"run"in e?Y$(e,t):X$(e||t)},Q$=K$;function Y$(e,t){return(n,r,i)=>{e.run(g_(n,t),r,l=>{i(l)})}}function X$(e){return t=>g_(t,e)}class Ls{constructor(t,n,r){this.property=t,this.normal=n,r&&(this.space=r)}}Ls.prototype.property={};Ls.prototype.normal={};Ls.prototype.space=null;function m_(e,t){const n={},r={};let i=-1;for(;++i4&&n.slice(0,4)==="data"&&nB.test(t)){if(t.charAt(4)==="-"){const l=t.slice(5).replace(Ww,lB);r="data"+l.charAt(0).toUpperCase()+l.slice(1)}else{const l=t.slice(4);if(!Ww.test(l)){let s=l.replace(rB,oB);s.charAt(0)!=="-"&&(s="-"+s),t="data"+s}}i=Ov}return new i(r,t)}function oB(e){return"-"+e.toLowerCase()}function lB(e){return e.charAt(1).toUpperCase()}const Vw={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"},uB=m_([x_,y_,E_,C_,eB],"html"),sB=m_([x_,y_,E_,C_,tB],"svg");function aB(e){if(e.allowedElements&&e.disallowedElements)throw new TypeError("Only one of `allowedElements` and `disallowedElements` should be defined");if(e.allowedElements||e.disallowedElements||e.allowElement)return t=>{bv(t,"element",(n,r,i)=>{const l=i;let s;if(e.allowedElements?s=!e.allowedElements.includes(n.tagName):e.disallowedElements&&(s=e.disallowedElements.includes(n.tagName)),!s&&e.allowElement&&typeof r=="number"&&(s=!e.allowElement(n,r,l)),s&&typeof r=="number")return e.unwrapDisallowed&&n.children?l.children.splice(r,1,...n.children):l.children.splice(r,1),r})}}function cB(e){var t=e&&typeof e=="object"&&e.type==="text"?e.value||"":e;return typeof t=="string"&&t.replace(/[ \t\n\f\r]/g,"")===""}function fB(e){return e.join(" ").trim()}function dB(e,t){const n=t||{};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}var qw=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,pB=/\n/g,hB=/^\s*/,gB=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,mB=/^:\s*/,vB=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,yB=/^[;\s]*/,xB=/^\s+|\s+$/g,wB=` +`,Gw="/",Kw="*",bo="",SB="comment",EB="declaration",CB=function(e,t){if(typeof e!="string")throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var n=1,r=1;function i(w){var E=w.match(pB);E&&(n+=E.length);var A=w.lastIndexOf(wB);r=~A?w.length-A:r+w.length}function l(){var w={line:n,column:r};return function(E){return E.position=new s(w),d(),E}}function s(w){this.start=w,this.end={line:n,column:r},this.source=t.source}s.prototype.content=e;function a(w){var E=new Error(t.source+":"+n+":"+r+": "+w);if(E.reason=w,E.filename=t.source,E.line=n,E.column=r,E.source=e,!t.silent)throw E}function f(w){var E=w.exec(e);if(!!E){var A=E[0];return i(A),e=e.slice(A.length),E}}function d(){f(hB)}function h(w){var E;for(w=w||[];E=g();)E!==!1&&w.push(E);return w}function g(){var w=l();if(!(Gw!=e.charAt(0)||Kw!=e.charAt(1))){for(var E=2;bo!=e.charAt(E)&&(Kw!=e.charAt(E)||Gw!=e.charAt(E+1));)++E;if(E+=2,bo===e.charAt(E-1))return a("End of comment missing");var A=e.slice(2,E-2);return r+=2,i(A),e=e.slice(E),r+=2,w({type:SB,comment:A})}}function y(){var w=l(),E=f(gB);if(!!E){if(g(),!f(mB))return a("property missing ':'");var A=f(vB),v=w({type:EB,property:Qw(E[0].replace(qw,bo)),value:A?Qw(A[0].replace(qw,bo)):bo});return f(yB),v}}function m(){var w=[];h(w);for(var E;E=y();)E!==!1&&(w.push(E),h(w));return w}return d(),m()};function Qw(e){return e?e.replace(xB,bo):bo}var kB=CB;function _B(e,t){var n=null;if(!e||typeof e!="string")return n;for(var r,i=kB(e),l=typeof t=="function",s,a,f=0,d=i.length;f0?be.createElement(y,a,h):be.createElement(y,a)}function TB(e){let t=-1;for(;++t for more info)`),delete qa[l]}const t=o6().use(s$).use(e.remarkPlugins||[]).use(Q$,{...e.remarkRehypeOptions,allowDangerousHtml:!0}).use(e.rehypePlugins||[]).use(aB,e),n=new Vk;typeof e.children=="string"?n.value=e.children:e.children!==void 0&&e.children!==null&&console.warn(`[react-markdown] Warning: please pass a string as \`children\` (not: \`${e.children}\`)`);const r=t.runSync(t.parse(n),n);if(r.type!=="root")throw new TypeError("Expected a `root` node");let i=be.createElement(be.Fragment,{},k_({options:e,schema:uB,listDepth:0},r));return e.className&&(i=be.createElement("div",{className:e.className},i)),i}Iv.defaultProps={transformLinkUri:qz};Iv.propTypes={children:Se.exports.string,className:Se.exports.string,allowElement:Se.exports.func,allowedElements:Se.exports.arrayOf(Se.exports.string),disallowedElements:Se.exports.arrayOf(Se.exports.string),unwrapDisallowed:Se.exports.bool,remarkPlugins:Se.exports.arrayOf(Se.exports.oneOfType([Se.exports.object,Se.exports.func,Se.exports.arrayOf(Se.exports.oneOfType([Se.exports.bool,Se.exports.string,Se.exports.object,Se.exports.func,Se.exports.arrayOf(Se.exports.any)]))])),rehypePlugins:Se.exports.arrayOf(Se.exports.oneOfType([Se.exports.object,Se.exports.func,Se.exports.arrayOf(Se.exports.oneOfType([Se.exports.bool,Se.exports.string,Se.exports.object,Se.exports.func,Se.exports.arrayOf(Se.exports.any)]))])),sourcePos:Se.exports.bool,rawSourcePos:Se.exports.bool,skipHtml:Se.exports.bool,includeElementIndex:Se.exports.bool,transformLinkUri:Se.exports.oneOfType([Se.exports.func,Se.exports.bool]),linkTarget:Se.exports.oneOfType([Se.exports.func,Se.exports.string]),transformImageUri:Se.exports.func,components:Se.exports.object};const MB=()=>we("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"1.5",stroke:"#ffffff",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[V("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),V("circle",{cx:"12",cy:"12",r:"9"}),V("polyline",{points:"12 7 12 12 15 15"})]}),Xw=()=>V("div",{className:"divider"}),NB=({item:e,inventoryType:t,style:n},r)=>{const i=yi(d=>d.inventory.additionalMetadata),l=T.exports.useMemo(()=>ct[e.name],[e]),s=T.exports.useMemo(()=>e.ingredients?Object.entries(e.ingredients).sort((d,h)=>d[1]-h[1]):null,[e]),a=e.metadata?.description||l?.description,f=l?.ammoName&&ct[l?.ammoName]?.label;return V(bn,{children:l?we("div",{style:{...n},className:"tooltip-wrapper",ref:r,children:[we("div",{className:"tooltip-header-wrapper",children:[V("p",{children:e.metadata?.label||l.label||e.name}),t==="crafting"?we("div",{className:"tooltip-crafting-duration",children:[V(MB,{}),we("p",{children:[(e.duration!==void 0?e.duration:3e3)/1e3,"s"]})]}):V("p",{children:e.metadata?.type})]}),V(Xw,{}),a&&V("div",{className:"tooltip-description",children:V(Iv,{className:"tooltip-markdown",children:a})}),t!=="crafting"?we(bn,{children:[e.durability!==void 0&&we("p",{children:[ot.ui_durability,": ",Math.trunc(e.durability)]}),e.metadata?.ammo!==void 0&&we("p",{children:[ot.ui_ammo,": ",e.metadata.ammo]}),f&&we("p",{children:[ot.ammo_type,": ",f]}),e.metadata?.serial&&we("p",{children:[ot.ui_serial,": ",e.metadata.serial]}),e.metadata?.components&&e.metadata?.components[0]&&we("p",{children:[ot.ui_components,":"," ",(e.metadata?.components).map((d,h,g)=>h+1===g.length?ct[d]?.label:ct[d]?.label+", ")]}),e.metadata?.weapontint&&we("p",{children:[ot.ui_tint,": ",e.metadata.weapontint]}),i.map((d,h)=>V(T.exports.Fragment,{children:e.metadata&&e.metadata[d.metadata]&&we("p",{children:[d.value,": ",e.metadata[d.metadata]]})},`metadata-${h}`))]}):V("div",{className:"tooltip-ingredients",children:s&&s.map(d=>{const[h,g]=[d[0],d[1]];return we("div",{className:"tooltip-ingredient",children:[V("img",{src:h?zl(h):"none",alt:"item-image"}),V("p",{children:g>=1?`${g}x ${ct[h]?.label||h}`:g===0?`${ct[h]?.label||h}`:g<1&&`${g*100}% ${ct[h]?.label||h}`})]},`ingredient-${h}`)})})]}):we("div",{className:"tooltip-wrapper",ref:r,style:n,children:[V("div",{className:"tooltip-header-wrapper",children:V("p",{children:e.name})}),V(Xw,{})]})})},FB=be.forwardRef(NB);function zB(e,t){const[n,r]=T.exports.useState(e);return T.exports.useEffect(()=>{const i=setTimeout(()=>r(e),t||500);return()=>{clearTimeout(i)}},[e,t]),n}const $B=()=>{const e=yi(a=>a.tooltip);zB(e.open,500),be.useState(!1),T.exports.useRef(null),T.exports.useRef(!1);const{refs:t,context:n,floatingStyles:r}=mv({middleware:[fk(),pk(),dk({mainAxis:10,crossAxis:10})],open:e.open,placement:"right-start"}),{isMounted:i,styles:l}=vv(n,{duration:200}),s=({clientX:a,clientY:f})=>{t.setPositionReference({getBoundingClientRect(){return{width:0,height:0,x:a,y:f,left:a,top:f,right:a,bottom:f}}})};return be.useEffect(()=>(window.addEventListener("mousemove",s),()=>{window.removeEventListener("mousemove",s)}),[]),V(bn,{children:i&&e.item&&e.inventoryType&&V(gv,{children:V(FB,{ref:t.setFloating,style:{...r,...l},item:e.item,inventoryType:e.inventoryType})})})},BB=e=>{const t=document.createElement("input");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)},Mg=T.exports.createContext({getItemProps:()=>({}),activeIndex:null,setActiveIndex:()=>{},setHasFocusInside:()=>{},isOpen:!1}),Zw=T.exports.forwardRef(({children:e,label:t,...n},r)=>{const i=yi(ue=>ue.contextMenu),[l,s]=T.exports.useState(!1),[a,f]=T.exports.useState(!1),[d,h]=T.exports.useState(null),g=T.exports.useRef([]),y=T.exports.useRef([]),m=T.exports.useContext(Mg),w=ao(),E=B4(),A=Ko(),v=_k(),S=A!=null,{floatingStyles:_,refs:P,context:D}=mv({nodeId:E,open:l,onOpenChange:s,placement:S?"right-start":"bottom-start",middleware:[dk({mainAxis:S?0:4,alignmentAxis:S?-4:0}),fk(),pk()],whileElementsMounted:d4}),{isMounted:R,styles:F}=vv(D);T.exports.useEffect(()=>{S||(i.coords&&(P.setPositionReference({getBoundingClientRect(){return{width:0,height:0,x:i.coords.x,y:i.coords.y,top:i.coords.y,right:i.coords.x,bottom:i.coords.y,left:i.coords.x}}}),s(!0)),i.coords||s(!1))},[i]);const z=j4(D,{enabled:S,delay:{open:75},handleClose:pz({blockPointerEvents:!0})}),q=ez(D,{event:"mousedown",toggle:!S,ignoreMouse:S}),K=sz(D,{role:"menu"}),B=Fk(D,{bubbles:!0}),X=uz(D,{listRef:g,activeIndex:d,nested:S,onNavigate:h}),$=fz(D,{listRef:y,onMatch:l?h:void 0,activeIndex:d}),{getReferenceProps:H,getFloatingProps:ie,getItemProps:oe}=zk([z,q,K,B,X,$]);return T.exports.useEffect(()=>{if(!w)return;function ue(){s(!1)}function U(J){J.nodeId!==E&&J.parentId===A&&s(!1)}return w.events.on("click",ue),w.events.on("menuopen",U),()=>{w.events.off("click",ue),w.events.off("menuopen",U)}},[w,E,A]),T.exports.useEffect(()=>{l&&w&&w.events.emit("menuopen",{parentId:A,nodeId:E})},[w,l,E,A]),we(U4,{id:E,children:[S&&we("button",{ref:fv([P.setReference,v.ref,r]),tabIndex:S?m.activeIndex===v.index?0:-1:void 0,role:S?"menuitem":void 0,"data-open":l?"":void 0,"data-nested":S?"":void 0,"data-focus-inside":a?"":void 0,className:S?"context-menu-item":"context-menu-list",...H(m.getItemProps({...n,onFocus(ue){n.onFocus?.(ue),f(!1),m.setHasFocusInside(!0)}})),children:[t,S&&V("span",{"aria-hidden":!0,style:{marginLeft:10,fontSize:10},children:"▶"})]}),V(Mg.Provider,{value:{activeIndex:d,setActiveIndex:h,getItemProps:oe,setHasFocusInside:f,isOpen:l},children:V(N4,{elementsRef:g,labelsRef:y,children:R&&V(gv,{children:V(Nk,{lockScroll:!0,children:V(Mk,{context:D,modal:!0,initialFocus:P.floating,children:V("div",{ref:P.setFloating,className:"context-menu-list",style:{..._,...F},...ie(),children:e})})})})})})]})}),Ai=T.exports.forwardRef(({label:e,disabled:t,...n},r)=>{const i=T.exports.useContext(Mg),l=_k({label:t?null:e}),s=ao(),a=l.index===i.activeIndex;return V("button",{...n,ref:fv([l.ref,r]),type:"button",role:"menuitem",className:"context-menu-item",tabIndex:a?0:-1,disabled:t,...i.getItemProps({onClick(f){n.onClick?.(f),s?.events.emit("click")},onFocus(f){n.onFocus?.(f),i.setHasFocusInside(!0)}}),children:e})}),gh=T.exports.forwardRef((e,t)=>Ko()===null?V(H4,{children:V(Zw,{...e,ref:t})}):V(Zw,{...e,ref:t})),UB=()=>{const t=yi(i=>i.contextMenu).item,n=i=>{if(!!t)switch(i&&i.action){case"use":iv({name:t.name,slot:t.slot});break;case"give":ek({name:t.name,slot:t.slot});break;case"drop":wn(t)&&kg({item:t,inventory:"player"});break;case"remove":cr("removeComponent",{component:i?.component,slot:i?.slot});break;case"removeAmmo":cr("removeAmmo",t.slot);break;case"copy":BB(i.serial||"");break;case"custom":cr("useButton",{id:(i?.id||0)+1,slot:t.slot});break}},r=i=>i.reduce((l,s,a)=>{if(s.group){const f=l.findIndex(d=>d.groupName===s.group);f!==-1?l[f].buttons.push({...s,index:a}):l.push({groupName:s.group,buttons:[{...s,index:a}]})}else l.push({groupName:null,buttons:[{...s,index:a}]});return l},[]);return V(bn,{children:we(gh,{children:[V(Ai,{onClick:()=>n({action:"use"}),label:ot.ui_use||"Use"}),V(Ai,{onClick:()=>n({action:"give"}),label:ot.ui_give||"Give"}),V(Ai,{onClick:()=>n({action:"drop"}),label:ot.ui_drop||"Drop"}),t&&t.metadata?.ammo>0&&V(Ai,{onClick:()=>n({action:"removeAmmo"}),label:ot.ui_remove_ammo}),t&&t.metadata?.serial&&V(Ai,{onClick:()=>n({action:"copy",serial:t.metadata?.serial}),label:ot.ui_copy}),t&&t.metadata?.components&&t.metadata?.components.length>0&&V(gh,{label:ot.ui_removeattachments,children:t&&t.metadata?.components.map((i,l)=>V(Ai,{onClick:()=>n({action:"remove",component:i,slot:t.slot}),label:ct[i]?.label||""},l))}),(t&&t.name&&ct[t.name]?.buttons?.length||0)>0&&V(bn,{children:t&&t.name&&r(ct[t.name]?.buttons).map((i,l)=>V(be.Fragment,{children:i.groupName?V(gh,{label:i.groupName,children:i.buttons.map(s=>V(Ai,{onClick:()=>n({action:"custom",id:s.index}),label:s.label},s.index))}):i.buttons.map(s=>V(Ai,{onClick:()=>n({action:"custom",id:s.index}),label:s.label},s.index))},l))})]})})},__=e=>{const t=be.useRef(null);return V(Hk,{in:e.in,nodeRef:t,classNames:"transition-fade",timeout:200,unmountOnExit:!0,children:V("span",{ref:t,children:e.children})})},HB=()=>{const[e,t]=be.useState(!1),n=ru();return Br("setInventoryVisible",t),Br("closeInventory",()=>{t(!1),n(JC()),n(Xu())}),Mz(t),Br("setupInventory",r=>{n(QC(r)),!e&&t(!0)}),Br("refreshSlots",r=>n(C3(r))),Br("displayMetadata",r=>{n(v3(r))}),we(bn,{children:[V(__,{in:e,children:we("div",{className:"inventory-wrapper",children:[V(Vz,{}),V(gz,{}),V(Wz,{}),V($B,{}),V(UB,{})]})}),V(Dz,{})]})},Ng=(e,t)=>({x:e.x-t.x,y:e.y-t.y}),jB=e=>{const t=e.getInitialClientOffset(),n=e.getInitialSourceClientOffset();return t===null||n===null||t.x===void 0||t.y===void 0?{x:0,y:0}:Ng(t,n)},WB=(e,t)=>{const n=e.getClientOffset();if(n===null)return null;if(!t.current||!t.current.getBoundingClientRect)return Ng(n,jB(e));const r=t.current.getBoundingClientRect(),i={x:r.width/2,y:r.height/2};return Ng(n,i)},VB=()=>{const e=T.exports.useRef(null),{data:t,isDragging:n,currentOffset:r}=lF(i=>({data:i.getItem(),currentOffset:WB(i,e),isDragging:i.isDragging()}));return V(bn,{children:n&&r&&t.item&&V("div",{className:"item-drag-preview",ref:e,style:{transform:`translate(${r.x}px, ${r.y}px)`,backgroundImage:t.image}})})},qB=e=>{const[t,n]=be.useState(!1),r=be.useCallback(({key:l})=>{l===e&&n(!0)},[e]),i=be.useCallback(({key:l})=>{l===e&&n(!1)},[e]);return be.useEffect(()=>(window.addEventListener("keydown",r),window.addEventListener("keyup",i),()=>{window.removeEventListener("keydown",r),window.removeEventListener("keyup",i)}),[r,i]),t},GB=()=>{const e=ru(),t=qB("Shift");return T.exports.useEffect(()=>{e(x3(t))},[t,e]),V(bn,{})},KB=()=>{const e=ru(),t=vi();return Br("init",({locale:n,items:r,leftInventory:i,imagepath:l})=>{for(const s in n)ot[s]=n[s];for(const s in r)ct[s]=r[s];l3(l),e(QC({leftInventory:i}))}),cr("uiLoaded",{}),Br("closeInventory",()=>{t.dispatch({type:"dnd-core/END_DRAG"})}),we("div",{className:"app-wrapper",children:[V(HB,{}),V(VB,{}),V(GB,{})]})};addEventListener("dragstart",function(e){e.preventDefault()});const QB=(e=[])=>{const[t,n]=T.exports.useState(e);return{add:r=>{n(i=>[...i,r])},remove:()=>{let r;return n(([i,...l])=>(r=i,l)),r},get values(){return t},get first(){return t[0]},get last(){return t[t.length-1]},get size(){return t.length}}},YB=be.createContext(null),XB=be.forwardRef((e,t)=>{const n=e.item.item;return V("div",{className:"item-notification-item-box",style:{backgroundImage:`url(${zl(n)||"none"}`,...e.style},ref:t,children:we("div",{className:"item-slot-wrapper",children:[V("div",{className:"item-notification-action-box",children:V("p",{children:e.item.text})}),V("div",{className:"inventory-slot-label-box",children:V("div",{className:"inventory-slot-label-text",children:n.metadata?.label||ct[n.name]?.label})})]})})}),ZB=({children:e})=>{const t=QB(),n=r=>{const i=be.createRef(),l={id:Date.now(),item:r,ref:i};t.add(l);const s=setTimeout(()=>{t.remove(),clearTimeout(s)},2500)};return Br("itemNotify",([r,i,l])=>{n({item:r,text:l?`${ot[i]} ${l}x`:`${ot[i]}`})}),we(YB.Provider,{value:{add:n},children:[e,Vo.exports.createPortal(V(Pz,{className:"item-notification-container",children:t.values.map((r,i)=>V(__,{children:V(XB,{item:r.item,ref:r.ref})},`item-notification-${i}`))}),document.body)]})},$u=document.getElementById("root");GC()&&($u.style.backgroundImage='url("https://i.imgur.com/3pzRj9n.png")',$u.style.backgroundSize="cover",$u.style.backgroundRepeat="no-repeat",$u.style.backgroundPosition="center");aC($u).render(V(be.StrictMode,{children:V(fM,{store:Mn,children:V(FN,{backend:CF,options:{enableMouseEvents:!0},children:V(ZB,{children:V(KB,{})})})})})); diff --git a/server-data/resources/[ox]/ox_inventory/web/build/index.html b/server-data/resources/[ox]/ox_inventory/web/build/index.html index a991e4a41..d690375a3 100644 --- a/server-data/resources/[ox]/ox_inventory/web/build/index.html +++ b/server-data/resources/[ox]/ox_inventory/web/build/index.html @@ -1,20 +1,17 @@ - - - - - - - - NUI React Boilerplate - - - - - -
- - - - \ No newline at end of file + + + + + + + NUI React Boilerplate + + + + +
+ + + From eda88d6c4848f19de8bf8452b1041dc675c976bf Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 29 Feb 2024 20:13:24 +0100 Subject: [PATCH 17/18] chore: new database for version 1.0.1 --- server-data/[SQL]/es_extended.sql | 708 +++++++++++++----------------- 1 file changed, 308 insertions(+), 400 deletions(-) diff --git a/server-data/[SQL]/es_extended.sql b/server-data/[SQL]/es_extended.sql index 6e8f97a48..a8cf03f65 100644 --- a/server-data/[SQL]/es_extended.sql +++ b/server-data/[SQL]/es_extended.sql @@ -16,7 +16,7 @@ -- Dump della struttura del database es_extended -CREATE DATABASE IF NOT EXISTS `es_extended` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */; +CREATE DATABASE IF NOT EXISTS `es_extended` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */; USE `es_extended`; -- Dump della struttura di tabella es_extended.addon_account @@ -25,15 +25,18 @@ CREATE TABLE IF NOT EXISTS `addon_account` ( `label` varchar(100) NOT NULL, `shared` int(11) NOT NULL, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.addon_account: ~12 rows (circa) +-- Dump dei dati della tabella es_extended.addon_account: ~15 rows (circa) INSERT INTO `addon_account` (`name`, `label`, `shared`) VALUES - ('society_ambulance', 'Ambulance', 1), + ('bank_savings', 'Savings account', 0), + ('caution', 'caution', 0), + ('society_ambulance', 'EMS', 1), ('society_ammu', 'Ammu', 1), ('society_baker', 'Baker', 1), ('society_ballas', 'Ballas', 1), - ('society_cardealer', 'Concessionnaire', 1), + ('society_banker', 'Bank', 1), + ('society_cardealer', 'Cardealer', 1), ('society_dustman', 'Dustman', 1), ('society_fisherman', 'Fisherman', 1), ('society_import', 'Import', 1), @@ -51,22 +54,25 @@ CREATE TABLE IF NOT EXISTS `addon_account_data` ( PRIMARY KEY (`id`), UNIQUE KEY `index_addon_account_data_account_name_owner` (`account_name`,`owner`), KEY `index_addon_account_data_account_name` (`account_name`) -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.addon_account_data: ~12 rows (circa) +-- Dump dei dati della tabella es_extended.addon_account_data: ~15 rows (circa) INSERT INTO `addon_account_data` (`id`, `account_name`, `money`, `owner`) VALUES - (1, 'society_ambulance', 0, NULL), - (2, 'society_ammu', 0, NULL), - (3, 'society_baker', 0, NULL), - (4, 'society_ballas', 0, NULL), - (5, 'society_cardealer', 0, NULL), - (6, 'society_dustman', 0, NULL), - (7, 'society_fisherman', 0, NULL), - (8, 'society_import', 0, NULL), - (9, 'society_mechanic', 0, NULL), - (10, 'society_police', 0, NULL), - (11, 'society_taxi', 0, NULL), - (12, 'society_unicorn', 0, NULL); + (4, 'society_mechanic', 0, NULL), + (9, 'society_ambulance', 0, NULL), + (10, 'society_ammu', 0, NULL), + (11, 'society_baker', 0, NULL), + (12, 'society_ballas', 0, NULL), + (13, 'society_banker', 0, NULL), + (14, 'society_cardealer', 0, NULL), + (15, 'society_dustman', 0, NULL), + (16, 'society_fisherman', 0, NULL), + (17, 'society_import', 0, NULL), + (18, 'society_police', 0, NULL), + (19, 'society_taxi', 0, NULL), + (20, 'society_unicorn', 0, NULL), + (21, 'caution', 0, ''), + (22, 'bank_savings', 0, ''); -- Dump della struttura di tabella es_extended.addon_inventory CREATE TABLE IF NOT EXISTS `addon_inventory` ( @@ -74,15 +80,15 @@ CREATE TABLE IF NOT EXISTS `addon_inventory` ( `label` varchar(100) NOT NULL, `shared` int(11) NOT NULL, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.addon_inventory: ~12 rows (circa) INSERT INTO `addon_inventory` (`name`, `label`, `shared`) VALUES - ('society_ambulance', 'Ambulance', 1), + ('society_ambulance', 'EMS', 1), ('society_ammu', 'Ammu', 1), ('society_baker', 'Baker', 1), ('society_ballas', 'Ballas', 1), - ('society_cardealer', 'Concesionnaire', 1), + ('society_cardealer', 'Cardealer', 1), ('society_dustman', 'Dustman', 1), ('society_fisherman', 'Fisherman', 1), ('society_import', 'Import', 1), @@ -102,7 +108,7 @@ CREATE TABLE IF NOT EXISTS `addon_inventory_items` ( KEY `index_addon_inventory_items_inventory_name_name` (`inventory_name`,`name`), KEY `index_addon_inventory_items_inventory_name_name_owner` (`inventory_name`,`name`,`owner`), KEY `index_addon_inventory_inventory_name` (`inventory_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.addon_inventory_items: ~0 rows (circa) @@ -118,7 +124,7 @@ CREATE TABLE IF NOT EXISTS `banking` ( PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.banking: ~0 rows (circa) +-- Dump dei dati della tabella es_extended.banking: ~1 rows (circa) -- Dump della struttura di tabella es_extended.billing CREATE TABLE IF NOT EXISTS `billing` ( @@ -126,11 +132,11 @@ CREATE TABLE IF NOT EXISTS `billing` ( `identifier` varchar(46) DEFAULT NULL, `sender` varchar(60) NOT NULL, `target_type` varchar(50) NOT NULL, - `target` varchar(60) NOT NULL, + `target` varchar(40) NOT NULL, `label` varchar(255) NOT NULL, `amount` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.billing: ~0 rows (circa) @@ -140,7 +146,7 @@ CREATE TABLE IF NOT EXISTS `bpt_doorlock` ( `name` varchar(50) NOT NULL, `data` longtext NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.bpt_doorlock: ~42 rows (circa) INSERT INTO `bpt_doorlock` (`id`, `name`, `data`) VALUES @@ -195,38 +201,38 @@ CREATE TABLE IF NOT EXISTS `bpt_items` ( -- Dump dei dati della tabella es_extended.bpt_items: ~32 rows (circa) INSERT INTO `bpt_items` (`name`, `label`) VALUES - ('bandage', 'benda'), - ('cottonforbandages', 'cotone per bende'), - ('cotton', 'cotone'), - ('ironsheet', 'lamiera di ferro'), - ('garbage', 'rifiuti'), - ('WEAPON_APPISTOL', 'pistola AP'), - ('iron', 'Ferro'), - ('hammer', 'martello'), + ('bandage', 'bandage'), + ('cottonforbandages', 'cottonforbandages'), + ('cotton', 'cotton'), + ('ironsheet', 'ironsheet'), + ('garbage', 'garbage'), + ('WEAPON_APPISTOL', 'WEAPON APPISTOL'), + ('iron', 'iron'), + ('hammer', 'hammer'), ('legnatagliata', 'asse di legno'), - ('fixkit', 'kit di riparazione'), - ('almondmilk', 'latte di mandorla'), - ('ice', 'ghiaccio'), - ('water', 'acqua'), - ('almonds', 'mandorle'), - ('chips', 'patatine fritte'), - ('slicedchips', 'patate affettate'), - ('potato', 'patate'), - ('trash_can', 'lattina usata'), - ('recycled_paper', 'carta riciclata'), - ('paper', 'carta'), - ('newspaper', 'giornale rovinato'), - ('trash_burgershot', 'scatola di burgershot usata'), - ('cigarette_paper', 'cartina'), - ('cigarrette_opium', 'sigaretta con oppio'), - ('opium', 'oppio'), - ('copper', 'Rame'), - ('gold', 'oro'), - ('gunpowder', 'polvere da sparo'), + ('fixkit', 'fixkit'), + ('almondmilk', 'almondmilk'), + ('ice', 'ice'), + ('water', 'water'), + ('almonds', 'almonds'), + ('chips', 'chips'), + ('slicedchips', 'slicedchips'), + ('potato', 'patato'), + ('trash_can', 'trash can'), + ('recycled_paper', 'recycled paper'), + ('paper', 'paper'), + ('newspaper', 'newspaper'), + ('trash_burgershot', 'trash burgershot'), + ('cigarette_paper', 'cigarette paper'), + ('cigarrette_opium', 'cigarrette opium'), + ('opium', 'opium'), + ('copper', 'copper'), + ('gold', 'gold'), + ('gunpowder', 'gunpowder'), ('ammo-sniper', '7.62 NATO'), - ('grain', 'grano'), - ('flour', 'farina'), - ('bread', 'panino vuoto'); + ('grain', 'grain'), + ('flour', 'flour'), + ('bread', 'empty sandwich'); -- Dump della struttura di tabella es_extended.cardealer_vehicles CREATE TABLE IF NOT EXISTS `cardealer_vehicles` ( @@ -234,7 +240,7 @@ CREATE TABLE IF NOT EXISTS `cardealer_vehicles` ( `vehicle` varchar(255) NOT NULL, `price` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.cardealer_vehicles: ~0 rows (circa) @@ -244,11 +250,12 @@ CREATE TABLE IF NOT EXISTS `datastore` ( `label` varchar(100) NOT NULL, `shared` int(11) NOT NULL, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.datastore: ~11 rows (circa) +-- Dump dei dati della tabella es_extended.datastore: ~16 rows (circa) INSERT INTO `datastore` (`name`, `label`, `shared`) VALUES - ('property', 'Property', 1), + ('property', 'Property', 0), + ('society_ambulance', 'EMS', 1), ('society_ammu', 'Ammu', 1), ('society_baker', 'Baker', 1), ('society_ballas', 'Ballas', 1), @@ -258,7 +265,11 @@ INSERT INTO `datastore` (`name`, `label`, `shared`) VALUES ('society_mechanic', 'Mechanic', 1), ('society_police', 'Police', 1), ('society_taxi', 'Taxi', 1), - ('society_unicorn', 'Unicorn', 1); + ('society_unicorn', 'Unicorn', 1), + ('user_ears', 'Ears', 0), + ('user_glasses', 'Glasses', 0), + ('user_helmet', 'Helmet', 0), + ('user_mask', 'Mask', 0); -- Dump della struttura di tabella es_extended.datastore_data CREATE TABLE IF NOT EXISTS `datastore_data` ( @@ -269,155 +280,29 @@ CREATE TABLE IF NOT EXISTS `datastore_data` ( PRIMARY KEY (`id`), UNIQUE KEY `index_datastore_data_name_owner` (`name`,`owner`), KEY `index_datastore_data_name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.datastore_data: ~145 rows (circa) +-- Dump dei dati della tabella es_extended.datastore_data: ~19 rows (circa) INSERT INTO `datastore_data` (`id`, `name`, `owner`, `data`) VALUES - (1, 'society_ammu', NULL, '\'{}\''), - (2, 'society_baker', NULL, '\'{}\''), - (3, 'society_ballas', NULL, '\'{}\''), - (4, 'society_dustman', NULL, '\'{}\''), - (5, 'society_fisherman', NULL, '\'{}\''), - (6, 'society_import', NULL, '\'{}\''), - (7, 'society_mechanic', NULL, '\'{}\''), - (8, 'society_police', NULL, '\'{}\''), - (9, 'society_taxi', NULL, '\'{}\''), - (10, 'society_unicorn', NULL, '\'{}\''), - (11, 'property', NULL, '{}'), - (12, 'property', NULL, '{}'), - (13, 'property', NULL, '{}'), - (14, 'property', NULL, '{}'), - (15, 'property', NULL, '{}'), + (3, 'society_mechanic', NULL, '{}'), + (5, 'property', NULL, '{}'), + (6, 'society_ambulance', NULL, '\'{}\''), + (7, 'society_ammu', NULL, '\'{}\''), + (8, 'society_baker', NULL, '\'{}\''), + (9, 'society_ballas', NULL, '\'{}\''), + (10, 'society_dustman', NULL, '\'{}\''), + (11, 'society_fisherman', NULL, '\'{}\''), + (12, 'society_import', NULL, '\'{}\''), + (13, 'society_police', NULL, '\'{}\''), + (14, 'society_taxi', NULL, '\'{}\''), + (15, 'society_unicorn', NULL, '\'{}\''), (16, 'property', NULL, '{}'), (17, 'property', NULL, '{}'), - (18, 'property', NULL, '{}'), - (19, 'property', NULL, '{}'), - (20, 'property', NULL, '{}'), - (21, 'property', NULL, '{}'), - (22, 'property', NULL, '{}'), - (23, 'property', NULL, '{}'), - (24, 'property', NULL, '{}'), - (25, 'property', NULL, '{}'), - (26, 'property', NULL, '{}'), - (27, 'property', NULL, '{}'), - (28, 'property', NULL, '{}'), - (29, 'property', NULL, '{}'), - (30, 'property', NULL, '{}'), - (31, 'property', NULL, '{}'), - (32, 'property', NULL, '{}'), - (33, 'property', NULL, '{}'), - (34, 'property', NULL, '{}'), - (35, 'property', NULL, '{}'), - (36, 'property', NULL, '{}'), - (37, 'property', NULL, '{}'), - (38, 'property', NULL, '{}'), - (39, 'property', NULL, '{}'), - (40, 'property', NULL, '{}'), - (41, 'property', NULL, '{}'), - (42, 'property', NULL, '{}'), - (43, 'property', NULL, '{}'), - (44, 'property', NULL, '{}'), - (45, 'property', NULL, '{}'), - (46, 'property', NULL, '{}'), - (47, 'property', NULL, '{}'), - (48, 'property', NULL, '{}'), - (49, 'property', NULL, '{}'), - (50, 'property', NULL, '{}'), - (51, 'property', NULL, '{}'), - (52, 'property', NULL, '{}'), - (53, 'property', NULL, '{}'), - (54, 'property', NULL, '{}'), - (55, 'property', NULL, '{}'), - (56, 'property', NULL, '{}'), - (57, 'property', NULL, '{}'), - (58, 'property', NULL, '{}'), - (59, 'property', NULL, '{}'), - (60, 'property', NULL, '{}'), - (61, 'property', NULL, '{}'), - (62, 'property', NULL, '{}'), - (63, 'property', NULL, '{}'), - (64, 'property', NULL, '{}'), - (65, 'property', NULL, '{}'), - (66, 'property', NULL, '{}'), - (67, 'property', NULL, '{}'), - (68, 'property', NULL, '{}'), - (69, 'property', NULL, '{}'), - (70, 'property', NULL, '{}'), - (71, 'property', NULL, '{}'), - (72, 'property', NULL, '{}'), - (73, 'property', NULL, '{}'), - (74, 'property', NULL, '{}'), - (75, 'property', NULL, '{}'), - (76, 'property', NULL, '{}'), - (77, 'property', NULL, '{}'), - (78, 'property', NULL, '{}'), - (79, 'property', NULL, '{}'), - (80, 'property', NULL, '{}'), - (81, 'property', NULL, '{}'), - (82, 'property', NULL, '{}'), - (83, 'property', NULL, '{}'), - (84, 'property', NULL, '{}'), - (85, 'property', NULL, '{}'), - (86, 'property', NULL, '{}'), - (87, 'property', NULL, '{}'), - (88, 'property', NULL, '{}'), - (89, 'property', NULL, '{}'), - (90, 'property', NULL, '{}'), - (91, 'property', NULL, '{}'), - (92, 'property', NULL, '{}'), - (93, 'property', NULL, '{}'), - (94, 'property', NULL, '{}'), - (95, 'property', NULL, '{}'), - (96, 'property', NULL, '{}'), - (97, 'property', NULL, '{}'), - (98, 'property', NULL, '{}'), - (99, 'property', NULL, '{}'), - (100, 'property', NULL, '{}'), - (101, 'property', NULL, '{}'), - (102, 'property', NULL, '{}'), - (103, 'property', NULL, '{}'), - (104, 'property', NULL, '{}'), - (105, 'property', NULL, '{}'), - (106, 'property', NULL, '{}'), - (107, 'property', NULL, '{}'), - (108, 'property', NULL, '{}'), - (109, 'property', NULL, '{}'), - (110, 'property', NULL, '{}'), - (111, 'property', NULL, '{}'), - (112, 'property', NULL, '{}'), - (113, 'property', NULL, '{}'), - (114, 'property', NULL, '{}'), - (115, 'property', NULL, '{}'), - (116, 'property', NULL, '{}'), - (117, 'property', NULL, '{}'), - (118, 'property', NULL, '{}'), - (119, 'property', NULL, '{}'), - (120, 'property', NULL, '{}'), - (121, 'property', NULL, '{}'), - (122, 'property', NULL, '{}'), - (123, 'property', NULL, '{}'), - (124, 'property', NULL, '{}'), - (125, 'property', NULL, '{}'), - (126, 'property', NULL, '{}'), - (127, 'property', NULL, '{}'), - (128, 'property', NULL, '{}'), - (129, 'property', NULL, '{}'), - (130, 'property', NULL, '{}'), - (131, 'property', NULL, '{}'), - (132, 'property', NULL, '{}'), - (133, 'property', NULL, '{}'), - (134, 'property', NULL, '{}'), - (135, 'property', NULL, '{}'), - (136, 'property', NULL, '{}'), - (137, 'property', NULL, '{}'), - (138, 'property', NULL, '{}'), - (139, 'property', NULL, '{}'), - (140, 'property', NULL, '{}'), - (141, 'property', NULL, '{}'), - (142, 'property', NULL, '{}'), - (143, 'property', NULL, '{}'), - (144, 'property', NULL, '{}'), - (145, 'property', NULL, '{}'); + (18, 'user_mask', '', '{}'), + (19, 'user_ears', '', '{}'), + (20, 'user_glasses', '', '{}'), + (21, 'user_helmet', '', '{}'), + (22, 'property', '', '{}'); -- Dump della struttura di tabella es_extended.fine_types CREATE TABLE IF NOT EXISTS `fine_types` ( @@ -426,62 +311,62 @@ CREATE TABLE IF NOT EXISTS `fine_types` ( `amount` int(11) DEFAULT NULL, `category` int(11) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.fine_types: ~52 rows (circa) INSERT INTO `fine_types` (`id`, `label`, `amount`, `category`) VALUES - (1, 'Usage abusif du klaxon', 30, 0), - (2, 'Franchir une ligne continue', 40, 0), - (3, 'Circulation à contresens', 250, 0), - (4, 'Demi-tour non autorisé', 250, 0), - (5, 'Circulation hors-route', 170, 0), - (6, 'Non-respect des distances de sécurité', 30, 0), - (7, 'Arrêt dangereux / interdit', 150, 0), - (8, 'Stationnement gênant / interdit', 70, 0), - (9, 'Non respect de la priorité à droite', 70, 0), - (10, 'Non-respect à un véhicule prioritaire', 90, 0), - (11, 'Non-respect d\'un stop', 105, 0), - (12, 'Non-respect d\'un feu rouge', 130, 0), - (13, 'Dépassement dangereux', 100, 0), - (14, 'Véhicule non en état', 100, 0), - (15, 'Conduite sans permis', 1500, 0), - (16, 'Délit de fuite', 800, 0), - (17, 'Excès de vitesse < 5 kmh', 90, 0), - (18, 'Excès de vitesse 5-15 kmh', 120, 0), - (19, 'Excès de vitesse 15-30 kmh', 180, 0), - (20, 'Excès de vitesse > 30 kmh', 300, 0), - (21, 'Entrave de la circulation', 110, 1), - (22, 'Dégradation de la voie publique', 90, 1), - (23, 'Trouble à l\'ordre publique', 90, 1), - (24, 'Entrave opération de police', 130, 1), - (25, 'Insulte envers / entre civils', 75, 1), - (26, 'Outrage à agent de police', 110, 1), - (27, 'Menace verbale ou intimidation envers civil', 90, 1), - (28, 'Menace verbale ou intimidation envers policier', 150, 1), - (29, 'Manifestation illégale', 250, 1), - (30, 'Tentative de corruption', 1500, 1), - (31, 'Arme blanche sortie en ville', 120, 2), - (32, 'Arme léthale sortie en ville', 300, 2), - (33, 'Port d\'arme non autorisé (défaut de license)', 600, 2), - (34, 'Port d\'arme illégal', 700, 2), - (35, 'Pris en flag lockpick', 300, 2), - (36, 'Vol de voiture', 1800, 2), - (37, 'Vente de drogue', 1500, 2), - (38, 'Fabriquation de drogue', 1500, 2), - (39, 'Possession de drogue', 650, 2), - (40, 'Prise d\'ôtage civil', 1500, 2), - (41, 'Prise d\'ôtage agent de l\'état', 2000, 2), - (42, 'Braquage particulier', 650, 2), - (43, 'Braquage magasin', 650, 2), - (44, 'Braquage de banque', 1500, 2), - (45, 'Tir sur civil', 2000, 3), - (46, 'Tir sur agent de l\'état', 2500, 3), - (47, 'Tentative de meurtre sur civil', 3000, 3), - (48, 'Tentative de meurtre sur agent de l\'état', 5000, 3), - (49, 'Meurtre sur civil', 10000, 3), - (50, 'Meurte sur agent de l\'état', 30000, 3), - (51, 'Meurtre involontaire', 1800, 3), - (52, 'Escroquerie à l\'entreprise', 2000, 2); + (1, 'Misuse of a horn', 30, 0), + (2, 'Illegally Crossing a continuous Line', 40, 0), + (3, 'Driving on the wrong side of the road', 250, 0), + (4, 'Illegal U-Turn', 250, 0), + (5, 'Illegally Driving Off-road', 170, 0), + (6, 'Refusing a Lawful Command', 30, 0), + (7, 'Illegally Stopping a Vehicle', 150, 0), + (8, 'Illegal Parking', 70, 0), + (9, 'Failing to Yield to the right', 70, 0), + (10, 'Failure to comply with Vehicle Information', 90, 0), + (11, 'Failing to stop at a Stop Sign ', 105, 0), + (12, 'Failing to stop at a Red Light', 130, 0), + (13, 'Illegal Passing', 100, 0), + (14, 'Driving an illegal Vehicle', 100, 0), + (15, 'Driving without a License', 1500, 0), + (16, 'Hit and Run', 800, 0), + (17, 'Exceeding Speeds Over < 5 mph', 90, 0), + (18, 'Exceeding Speeds Over 5-15 mph', 120, 0), + (19, 'Exceeding Speeds Over 15-30 mph', 180, 0), + (20, 'Exceeding Speeds Over > 30 mph', 300, 0), + (21, 'Impeding traffic flow', 110, 1), + (22, 'Public Intoxication', 90, 1), + (23, 'Disorderly conduct', 90, 1), + (24, 'Obstruction of Justice', 130, 1), + (25, 'Insults towards Civilans', 75, 1), + (26, 'Disrespecting of an LEO', 110, 1), + (27, 'Verbal Threat towards a Civilan', 90, 1), + (28, 'Verbal Threat towards an LEO', 150, 1), + (29, 'Providing False Information', 250, 1), + (30, 'Attempt of Corruption', 1500, 1), + (31, 'Brandishing a weapon in city Limits', 120, 2), + (32, 'Brandishing a Lethal Weapon in city Limits', 300, 2), + (33, 'No Firearms License', 600, 2), + (34, 'Possession of an Illegal Weapon', 700, 2), + (35, 'Possession of Burglary Tools', 300, 2), + (36, 'Grand Theft Auto', 1800, 2), + (37, 'Intent to Sell/Distrube of an illegal Substance', 1500, 2), + (38, 'Frabrication of an Illegal Substance', 1500, 2), + (39, 'Possession of an Illegal Substance ', 650, 2), + (40, 'Kidnapping of a Civilan', 1500, 2), + (41, 'Kidnapping of an LEO', 2000, 2), + (42, 'Robbery', 650, 2), + (43, 'Armed Robbery of a Store', 650, 2), + (44, 'Armed Robbery of a Bank', 1500, 2), + (45, 'Assault on a Civilian', 2000, 3), + (46, 'Assault of an LEO', 2500, 3), + (47, 'Attempt of Murder of a Civilian', 3000, 3), + (48, 'Attempt of Murder of an LEO', 5000, 3), + (49, 'Murder of a Civilian', 10000, 3), + (50, 'Murder of an LEO', 30000, 3), + (51, 'Involuntary manslaughter', 1800, 3), + (52, 'Fraud', 2000, 2); -- Dump della struttura di tabella es_extended.items CREATE TABLE IF NOT EXISTS `items` ( @@ -491,9 +376,43 @@ CREATE TABLE IF NOT EXISTS `items` ( `rare` tinyint(4) NOT NULL DEFAULT 0, `can_remove` tinyint(4) NOT NULL DEFAULT 1, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.items: ~0 rows (circa) +-- Dump dei dati della tabella es_extended.items: ~33 rows (circa) +INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES + ('alive_chicken', 'Living chicken', 1, 0, 1), + ('bandage', 'Bandage', 2, 0, 1), + ('blowpipe', 'Blowtorch', 2, 0, 1), + ('bread', 'Bread', 1, 0, 1), + ('cannabis', 'Cannabis', 3, 0, 1), + ('carokit', 'Body Kit', 3, 0, 1), + ('carotool', 'Tools', 2, 0, 1), + ('clothe', 'Cloth', 1, 0, 1), + ('copper', 'Copper', 1, 0, 1), + ('cutted_wood', 'Cut wood', 1, 0, 1), + ('diamond', 'Diamond', 1, 0, 1), + ('essence', 'Gas', 1, 0, 1), + ('fabric', 'Fabric', 1, 0, 1), + ('fish', 'Fish', 1, 0, 1), + ('fixkit', 'Repair Kit', 3, 0, 1), + ('fixtool', 'Repair Tools', 2, 0, 1), + ('gazbottle', 'Gas Bottle', 2, 0, 1), + ('gold', 'Gold', 1, 0, 1), + ('iron', 'Iron', 1, 0, 1), + ('marijuana', 'Marijuana', 2, 0, 1), + ('medikit', 'Medikit', 2, 0, 1), + ('packaged_chicken', 'Chicken fillet', 1, 0, 1), + ('packaged_plank', 'Packaged wood', 1, 0, 1), + ('petrol', 'Oil', 1, 0, 1), + ('petrol_raffin', 'Processed oil', 1, 0, 1), + ('phone', 'Phone', 1, 0, 1), + ('radio', 'Radio', 1, 0, 1), + ('slaughtered_chicken', 'Slaughtered chicken', 1, 0, 1), + ('stone', 'Stone', 1, 0, 1), + ('washed_stone', 'Washed stone', 1, 0, 1), + ('water', 'Water', 1, 0, 1), + ('wood', 'Wood', 1, 0, 1), + ('wool', 'Wool', 1, 0, 1); -- Dump della struttura di tabella es_extended.jobs CREATE TABLE IF NOT EXISTS `jobs` ( @@ -501,21 +420,21 @@ CREATE TABLE IF NOT EXISTS `jobs` ( `label` varchar(50) DEFAULT NULL, `whitelisted` tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.jobs: ~14 rows (circa) INSERT INTO `jobs` (`name`, `label`, `whitelisted`) VALUES - ('ambulance', 'Ambulance', 1), + ('ambulance', 'EMS', 1), ('ammu', 'Armeria', 1), ('baker', 'Panettiere', 1), ('ballas', 'Ballas', 1), - ('cardealer', 'Concessionnaire', 1), + ('cardealer', 'Cardealer', 1), ('delivery', 'Delivery', 0), ('dustman', 'Dustman', 1), ('fisherman', 'Fisherman', 1), ('import', 'Import', 1), ('mechanic', 'Mechanic', 1), - ('police', 'LSPD', 1), + ('police', 'Police', 1), ('taxi', 'Taxi', 1), ('unemployed', 'Unemployed', 0), ('unicorn', 'Unicorn', 1); @@ -531,85 +450,85 @@ CREATE TABLE IF NOT EXISTS `job_grades` ( `skin_male` longtext NOT NULL, `skin_female` longtext NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.job_grades: ~60 rows (circa) INSERT INTO `job_grades` (`id`, `job_name`, `grade`, `name`, `label`, `salary`, `skin_male`, `skin_female`) VALUES (1, 'unemployed', 0, 'unemployed', 'Unemployed', 200, '{}', '{}'), - (2, 'ambulance', 0, 'ambulance', 'Ambulancier', 20, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), - (3, 'ambulance', 1, 'doctor', 'Medecin', 40, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), - (4, 'ambulance', 2, 'chief_doctor', 'Medecin-chef', 60, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), - (5, 'ambulance', 3, 'boss', 'Chirurgien', 80, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), - (6, 'mechanic', 0, 'recrue', 'Recrue', 12, '{}', '{}'), - (7, 'mechanic', 1, 'novice', 'Novice', 24, '{}', '{}'), - (8, 'mechanic', 2, 'experimente', 'Experimente', 36, '{}', '{}'), - (9, 'mechanic', 3, 'chief', 'Chef d\'équipe', 48, '{}', '{}'), - (10, 'mechanic', 4, 'boss', 'Patron', 0, '{}', '{}'), - (11, 'police', 0, 'recruit', 'Recrue', 20, '{}', '{}'), - (12, 'police', 1, 'officer', 'Officier', 40, '{}', '{}'), - (13, 'police', 2, 'sergeant', 'Sergent', 60, '{}', '{}'), - (14, 'police', 3, 'lieutenant', 'Lieutenant', 85, '{}', '{}'), - (15, 'police', 4, 'boss', 'Commandant', 100, '{}', '{}'), - (16, 'taxi', 0, 'recrue', 'Recrue', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (17, 'taxi', 1, 'novice', 'Novice', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (18, 'taxi', 2, 'experimente', 'Experimente', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (19, 'taxi', 3, 'uber', 'Uber', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (20, 'taxi', 4, 'boss', 'Patron', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (21, 'cardealer', 0, 'recruit', 'Recrue', 10, '{}', '{}'), - (22, 'cardealer', 1, 'novice', 'Novice', 25, '{}', '{}'), - (23, 'cardealer', 2, 'experienced', 'Experimente', 40, '{}', '{}'), - (24, 'cardealer', 3, 'boss', 'Patron', 0, '{}', '{}'), - (25, 'ammu', 0, 'apprentice', 'Apprendista', 20, '{}', '{}'), - (26, 'ammu', 1, 'gunsmith', 'Armaiolo', 40, '{}', '{}'), - (27, 'ammu', 2, 'armorychief', 'Capo Armeria', 60, '{}', '{}'), - (28, 'ammu', 3, 'deputydirector', 'Vice direttore', 85, '{}', '{}'), - (29, 'ammu', 4, 'boss', 'Direttore', 100, '{}', '{}'), - (30, 'baker', 0, 'apprentice', 'Apprendista', 20, '{}', '{}'), - (31, 'baker', 1, 'gunsmith', 'Panettiere', 40, '{}', '{}'), - (32, 'baker', 2, 'armorychief', 'Capo', 60, '{}', '{}'), - (33, 'baker', 3, 'deputydirector', 'Vice direttore', 85, '{}', '{}'), - (34, 'baker', 4, 'boss', 'Direttore', 100, '{}', '{}'), - (35, 'ballas', 0, 'little', 'picciotto', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (36, 'ballas', 1, 'employee', 'scagnozzo', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (37, 'ballas', 2, 'trustedman', 'Uomo di fiducia', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (38, 'ballas', 3, 'adviser', 'consigliere', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (39, 'ballas', 4, 'boss', 'Capo ballas', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (40, 'delivery', 0, 'delivery', 'Delivery', 500, '{}', '{}'), - (41, 'dustman', 0, 'ontrial', 'in prova', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (42, 'dustman', 1, 'employee', 'dipendente', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (43, 'dustman', 2, 'driver', 'autista', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (44, 'dustman', 3, 'responsible', 'responsabile', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (45, 'dustman', 4, 'boss', 'Direttore', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (46, 'fisherman', 0, 'ontrial', 'in prova', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (47, 'fisherman', 1, 'employee', 'dipendente', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (48, 'fisherman', 2, 'driver', 'autista', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (49, 'fisherman', 3, 'responsible', 'responsabile', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (50, 'fisherman', 4, 'boss', 'Direttore', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (51, 'import', 0, 'ontrial', 'in prova', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (52, 'import', 1, 'employee', 'dipendente', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (53, 'import', 2, 'driver', 'autista', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (54, 'import', 3, 'responsible', 'responsabile', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (55, 'import', 4, 'boss', 'Direttore', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (56, 'unicorn', 0, 'ontrial', 'in prova', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (57, 'unicorn', 1, 'employee', 'ballerino', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (58, 'unicorn', 2, 'driver', 'barrista', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (59, 'unicorn', 3, 'responsible', 'responsabile', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), - (60, 'unicorn', 4, 'boss', 'Direttore', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'); + (41, 'ammu', 0, 'apprentice', 'Apprentice', 20, '{}', '{}'), + (42, 'ammu', 1, 'gunsmith', 'Gunsmith', 40, '{}', '{}'), + (43, 'ammu', 2, 'armorychief', 'Armory Chief', 60, '{}', '{}'), + (44, 'ammu', 3, 'deputydirector', 'Deputy Director', 85, '{}', '{}'), + (45, 'ammu', 4, 'boss', 'Boss', 100, '{}', '{}'), + (46, 'baker', 0, 'apprentice', 'Apprentice', 20, '{}', '{}'), + (47, 'baker', 1, 'baker', 'Baker', 40, '{}', '{}'), + (48, 'baker', 2, 'chief', 'Chief', 60, '{}', '{}'), + (49, 'baker', 3, 'deputydirector', 'Deputy Director', 85, '{}', '{}'), + (50, 'baker', 4, 'boss', 'Boss', 100, '{}', '{}'), + (51, 'ballas', 0, 'little', 'Little', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (52, 'ballas', 1, 'henchman', 'Henchman', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (53, 'ballas', 2, 'trustedman', 'Trusted man', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (54, 'ballas', 3, 'adviser', 'Adviser', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (55, 'ballas', 4, 'boss', 'Boss', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (56, 'delivery', 0, 'delivery', 'Delivery', 500, '{}', '{}'), + (57, 'dustman', 0, 'ontrial', 'Ontrial', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (58, 'dustman', 1, 'employee', 'Employee', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (59, 'dustman', 2, 'driver', 'Driver', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (60, 'dustman', 3, 'responsible', 'Responsible', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (61, 'dustman', 4, 'boss', 'Boss', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (62, 'fisherman', 0, 'ontrial', 'Ontrial', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (63, 'fisherman', 1, 'employee', 'Employee', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (64, 'fisherman', 2, 'driver', 'Driver', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (65, 'fisherman', 3, 'responsible', 'Responsible', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (66, 'fisherman', 4, 'boss', 'Boss', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (67, 'import', 0, 'ontrial', 'Ontrial', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (68, 'import', 1, 'employee', 'Employee', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (69, 'import', 2, 'driver', 'Driver', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (70, 'import', 3, 'responsible', 'Responsible', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (71, 'import', 4, 'boss', 'Boss', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (72, 'unicorn', 0, 'ontrial', 'Ontrial', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (73, 'unicorn', 1, 'employee', 'Employee', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (74, 'unicorn', 2, 'driver', 'Driver', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (75, 'unicorn', 3, 'responsible', 'Responsible', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (76, 'unicorn', 4, 'boss', 'Boss', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (77, 'ambulance', 0, 'ambulance', 'Jr. EMT', 20, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), + (78, 'ambulance', 1, 'doctor', 'EMT', 40, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), + (79, 'ambulance', 2, 'chief_doctor', 'Sr. EMT', 60, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), + (80, 'ambulance', 3, 'boss', 'EMT Supervisor', 80, '{"tshirt_2":0,"hair_color_1":5,"glasses_2":3,"shoes":9,"torso_2":3,"hair_color_2":0,"pants_1":24,"glasses_1":4,"hair_1":2,"sex":0,"decals_2":0,"tshirt_1":15,"helmet_1":8,"helmet_2":0,"arms":92,"face":19,"decals_1":60,"torso_1":13,"hair_2":0,"skin":34,"pants_2":5}', '{"tshirt_2":3,"decals_2":0,"glasses":0,"hair_1":2,"torso_1":73,"shoes":1,"hair_color_2":0,"glasses_1":19,"skin":13,"face":6,"pants_2":5,"tshirt_1":75,"pants_1":37,"helmet_1":57,"torso_2":0,"arms":14,"sex":1,"glasses_2":0,"decals_1":0,"hair_2":0,"helmet_2":0,"hair_color_1":0}'), + (81, 'mechanic', 0, 'recrue', 'Recruit', 12, '{}', '{}'), + (82, 'mechanic', 1, 'novice', 'Novice', 24, '{}', '{}'), + (83, 'mechanic', 2, 'experimente', 'Experienced', 36, '{}', '{}'), + (84, 'mechanic', 3, 'chief', 'Leader', 48, '{}', '{}'), + (85, 'mechanic', 4, 'boss', 'Boss', 0, '{}', '{}'), + (86, 'police', 0, 'recruit', 'Recruit', 20, '{}', '{}'), + (87, 'police', 1, 'officer', 'Officer', 40, '{}', '{}'), + (88, 'police', 2, 'sergeant', 'Sergeant', 60, '{}', '{}'), + (89, 'police', 3, 'lieutenant', 'Lieutenant', 85, '{}', '{}'), + (90, 'police', 4, 'boss', 'Chief', 100, '{}', '{}'), + (91, 'taxi', 0, 'recrue', 'Recruit', 12, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (92, 'taxi', 1, 'novice', 'Cabby', 24, '{"hair_2":0,"hair_color_2":0,"torso_1":32,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":0,"age_2":0,"glasses_2":0,"ears_2":0,"arms":27,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (93, 'taxi', 2, 'experimente', 'Experienced', 36, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (94, 'taxi', 3, 'uber', 'Uber Cabby', 48, '{"hair_2":0,"hair_color_2":0,"torso_1":26,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":57,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":11,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (95, 'taxi', 4, 'boss', 'Lead Cabby', 0, '{"hair_2":0,"hair_color_2":0,"torso_1":29,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":31,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":4,"age_2":0,"glasses_2":0,"ears_2":0,"arms":1,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":0,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":0,"bproof_1":0,"mask_1":0,"decals_1":0,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":4,"eyebrows_1":0,"face":0,"shoes_1":10,"pants_1":24}', '{"hair_2":0,"hair_color_2":0,"torso_1":57,"bags_1":0,"helmet_2":0,"chain_2":0,"eyebrows_3":0,"makeup_3":0,"makeup_2":0,"tshirt_1":38,"makeup_1":0,"bags_2":0,"makeup_4":0,"eyebrows_4":0,"chain_1":0,"lipstick_4":0,"bproof_2":0,"hair_color_1":0,"decals_2":0,"pants_2":1,"age_2":0,"glasses_2":0,"ears_2":0,"arms":21,"lipstick_1":0,"ears_1":-1,"mask_2":0,"sex":1,"lipstick_3":0,"helmet_1":-1,"shoes_2":0,"beard_2":0,"beard_1":0,"lipstick_2":0,"beard_4":0,"glasses_1":5,"bproof_1":0,"mask_1":0,"decals_1":1,"hair_1":0,"eyebrows_2":0,"beard_3":0,"age_1":0,"tshirt_2":0,"skin":0,"torso_2":0,"eyebrows_1":0,"face":0,"shoes_1":49,"pants_1":11}'), + (96, 'cardealer', 0, 'recruit', 'Recruit', 10, '{}', '{}'), + (97, 'cardealer', 1, 'novice', 'Novice', 25, '{}', '{}'), + (98, 'cardealer', 2, 'experienced', 'Experienced', 40, '{}', '{}'), + (99, 'cardealer', 3, 'boss', 'Boss', 0, '{}', '{}'); -- Dump della struttura di tabella es_extended.licenses CREATE TABLE IF NOT EXISTS `licenses` ( `type` varchar(60) NOT NULL, `label` varchar(60) NOT NULL, PRIMARY KEY (`type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.licenses: ~6 rows (circa) INSERT INTO `licenses` (`type`, `label`) VALUES ('boat', 'Boat License'), - ('dmv', 'Code de la route'), - ('drive', 'Permis de conduire'), - ('drive_bike', 'Permis moto'), - ('drive_truck', 'Permis camion'), + ('dmv', 'Driving Permit'), + ('drive', 'Drivers License'), + ('drive_bike', 'Motorcycle License'), + ('drive_truck', 'Commercial Drivers License'), ('weapon', 'Weapon License'); -- Dump della struttura di tabella es_extended.multicharacter_slots @@ -618,7 +537,7 @@ CREATE TABLE IF NOT EXISTS `multicharacter_slots` ( `slots` int(11) NOT NULL, PRIMARY KEY (`identifier`) USING BTREE, KEY `slots` (`slots`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.multicharacter_slots: ~0 rows (circa) @@ -634,7 +553,7 @@ CREATE TABLE IF NOT EXISTS `npwd_calls` ( `end` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_calls: ~0 rows (circa) @@ -690,7 +609,7 @@ CREATE TABLE IF NOT EXISTS `npwd_marketplace_listings` ( `reported` tinyint(4) NOT NULL DEFAULT 0, PRIMARY KEY (`id`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_marketplace_listings: ~0 rows (circa) @@ -709,7 +628,7 @@ CREATE TABLE IF NOT EXISTS `npwd_match_profiles` ( `updatedAt` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`), UNIQUE KEY `identifier_UNIQUE` (`identifier`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_match_profiles: ~1 rows (circa) @@ -725,15 +644,15 @@ CREATE TABLE IF NOT EXISTS `npwd_match_views` ( KEY `match_profile_idx` (`profile`), KEY `identifier` (`identifier`), CONSTRAINT `match_profile` FOREIGN KEY (`profile`) REFERENCES `npwd_match_profiles` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_match_views: ~0 rows (circa) -- Dump della struttura di tabella es_extended.npwd_messages CREATE TABLE IF NOT EXISTS `npwd_messages` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `message` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `user_identifier` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `message` varchar(512) NOT NULL, + `user_identifier` varchar(48) NOT NULL, `conversation_id` varchar(512) NOT NULL, `isRead` tinyint(4) NOT NULL DEFAULT 0, `createdAt` timestamp NOT NULL DEFAULT current_timestamp(), @@ -744,21 +663,21 @@ CREATE TABLE IF NOT EXISTS `npwd_messages` ( `embed` varchar(512) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `user_identifier` (`user_identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_messages: ~0 rows (circa) -- Dump della struttura di tabella es_extended.npwd_messages_conversations CREATE TABLE IF NOT EXISTS `npwd_messages_conversations` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `conversation_list` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `label` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `conversation_list` varchar(225) NOT NULL, + `label` varchar(60) DEFAULT '', `createdAt` timestamp NOT NULL DEFAULT current_timestamp(), `updatedAt` timestamp NOT NULL DEFAULT current_timestamp(), `last_message_id` int(11) DEFAULT NULL, `is_group_chat` tinyint(4) NOT NULL DEFAULT 0, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_messages_conversations: ~0 rows (circa) @@ -766,12 +685,12 @@ CREATE TABLE IF NOT EXISTS `npwd_messages_conversations` ( CREATE TABLE IF NOT EXISTS `npwd_messages_participants` ( `id` int(11) NOT NULL AUTO_INCREMENT, `conversation_id` int(11) NOT NULL, - `participant` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `participant` varchar(225) NOT NULL, `unread_count` int(11) DEFAULT 0, PRIMARY KEY (`id`) USING BTREE, KEY `message_participants_npwd_messages_conversations_id_fk` (`conversation_id`) USING BTREE, CONSTRAINT `message_participants_npwd_messages_conversations_id_fk` FOREIGN KEY (`conversation_id`) REFERENCES `npwd_messages_conversations` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_messages_participants: ~0 rows (circa) @@ -783,7 +702,7 @@ CREATE TABLE IF NOT EXISTS `npwd_notes` ( `content` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_notes: ~0 rows (circa) @@ -796,7 +715,7 @@ CREATE TABLE IF NOT EXISTS `npwd_phone_contacts` ( `display` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_phone_contacts: ~0 rows (circa) @@ -807,7 +726,7 @@ CREATE TABLE IF NOT EXISTS `npwd_phone_gallery` ( `image` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_phone_gallery: ~0 rows (circa) @@ -822,7 +741,7 @@ CREATE TABLE IF NOT EXISTS `npwd_twitter_likes` ( KEY `tweet_idx` (`tweet_id`), CONSTRAINT `profile` FOREIGN KEY (`profile_id`) REFERENCES `npwd_twitter_profiles` (`id`), CONSTRAINT `tweet` FOREIGN KEY (`tweet_id`) REFERENCES `npwd_twitter_tweets` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_twitter_likes: ~0 rows (circa) @@ -837,7 +756,7 @@ CREATE TABLE IF NOT EXISTS `npwd_twitter_profiles` ( PRIMARY KEY (`id`), UNIQUE KEY `profile_name_UNIQUE` (`profile_name`), KEY `identifier` (`identifier`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_twitter_profiles: ~1 rows (circa) @@ -852,43 +771,29 @@ CREATE TABLE IF NOT EXISTS `npwd_twitter_reports` ( KEY `tweet_idx` (`tweet_id`), CONSTRAINT `report_profile` FOREIGN KEY (`profile_id`) REFERENCES `npwd_twitter_profiles` (`id`), CONSTRAINT `report_tweet` FOREIGN KEY (`tweet_id`) REFERENCES `npwd_twitter_tweets` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_twitter_reports: ~0 rows (circa) -- Dump della struttura di tabella es_extended.npwd_twitter_tweets CREATE TABLE IF NOT EXISTS `npwd_twitter_tweets` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `message` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `message` varchar(1000) NOT NULL, `createdAt` timestamp NOT NULL DEFAULT current_timestamp(), `updatedAt` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `likes` int(11) NOT NULL DEFAULT 0, `identifier` varchar(46) DEFAULT NULL, `visible` tinyint(4) NOT NULL DEFAULT 1, - `images` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `images` varchar(1000) DEFAULT '', `retweet` int(11) DEFAULT NULL, `profile_id` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE, KEY `npwd_twitter_tweets_npwd_twitter_profiles_id_fk` (`profile_id`) USING BTREE, CONSTRAINT `npwd_twitter_tweets_npwd_twitter_profiles_id_fk` FOREIGN KEY (`profile_id`) REFERENCES `npwd_twitter_profiles` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.npwd_twitter_tweets: ~0 rows (circa) --- Dump della struttura di tabella es_extended.outfits -CREATE TABLE IF NOT EXISTS `outfits` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `identifier` varchar(46) DEFAULT NULL, - `name` longtext DEFAULT NULL, - `ped` longtext DEFAULT NULL, - `components` longtext DEFAULT NULL, - `props` longtext DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_UNIQUE` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; - --- Dump dei dati della tabella es_extended.outfits: ~0 rows (circa) - -- Dump della struttura di tabella es_extended.owned_vehicles CREATE TABLE IF NOT EXISTS `owned_vehicles` ( `owner` varchar(46) DEFAULT NULL, @@ -896,28 +801,17 @@ CREATE TABLE IF NOT EXISTS `owned_vehicles` ( `vehicle` longtext DEFAULT NULL, `type` varchar(20) NOT NULL DEFAULT 'car', `job` varchar(20) DEFAULT NULL, - `stored` tinyint(1) NOT NULL DEFAULT 0, + `stored` tinyint(4) NOT NULL DEFAULT 0, `parking` varchar(60) DEFAULT NULL, `pound` varchar(60) DEFAULT NULL, `peopleWithKeys` longtext DEFAULT NULL, `glovebox` longtext DEFAULT NULL, `trunk` longtext DEFAULT NULL, PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.owned_vehicles: ~0 rows (circa) --- Dump della struttura di tabella es_extended.ox_inventory -CREATE TABLE IF NOT EXISTS `ox_inventory` ( - `owner` varchar(46) DEFAULT NULL, - `name` varchar(100) NOT NULL, - `data` longtext DEFAULT NULL, - `lastupdated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - UNIQUE KEY `owner` (`owner`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- Dump dei dati della tabella es_extended.ox_inventory: ~0 rows (circa) - -- Dump della struttura di tabella es_extended.rented_vehicles CREATE TABLE IF NOT EXISTS `rented_vehicles` ( `vehicle` varchar(60) NOT NULL, @@ -927,7 +821,7 @@ CREATE TABLE IF NOT EXISTS `rented_vehicles` ( `rent_price` int(11) NOT NULL, `owner` varchar(46) DEFAULT NULL, PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.rented_vehicles: ~0 rows (circa) @@ -938,7 +832,7 @@ CREATE TABLE IF NOT EXISTS `society_moneywash` ( `society` varchar(60) NOT NULL, `amount` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.society_moneywash: ~0 rows (circa) @@ -952,22 +846,27 @@ CREATE TABLE IF NOT EXISTS `users` ( `job_grade` int(11) DEFAULT 0, `loadout` longtext DEFAULT NULL, `crafting_level` int(11) NOT NULL, - `position` varchar(255) DEFAULT '{"x":-269.4,"y":-955.3,"z":31.2,"heading":205.8}', + `metadata` longtext DEFAULT NULL, + `position` longtext DEFAULT NULL, `firstname` varchar(16) DEFAULT NULL, `lastname` varchar(16) DEFAULT NULL, `dateofbirth` varchar(10) DEFAULT NULL, `sex` varchar(1) DEFAULT NULL, `height` int(11) DEFAULT NULL, - `disabled` tinyint(1) DEFAULT 0, `skin` longtext DEFAULT NULL, + `status` longtext DEFAULT NULL, `is_dead` tinyint(1) DEFAULT 0, + `id` int(11) NOT NULL AUTO_INCREMENT, + `disabled` tinyint(1) DEFAULT 0, + `last_property` varchar(255) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + `last_seen` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp(), + `phone_number` varchar(20) DEFAULT NULL, `pincode` int(11) DEFAULT NULL, - `status` longtext DEFAULT NULL, `jail` int(11) NOT NULL DEFAULT 0, - `phone_number` varchar(20) DEFAULT NULL, - `last_property` longtext DEFAULT NULL, - PRIMARY KEY (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + PRIMARY KEY (`identifier`), + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.users: ~1 rows (circa) @@ -977,7 +876,7 @@ CREATE TABLE IF NOT EXISTS `user_licenses` ( `type` varchar(60) NOT NULL, `owner` varchar(46) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.user_licenses: ~0 rows (circa) @@ -992,7 +891,7 @@ CREATE TABLE IF NOT EXISTS `uteknark1` ( `soil` bigint(20) NOT NULL, PRIMARY KEY (`id`), KEY `stage` (`stage`,`time`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.uteknark1: ~0 rows (circa) @@ -1001,11 +900,10 @@ CREATE TABLE IF NOT EXISTS `vehicles` ( `name` varchar(60) NOT NULL, `model` varchar(60) NOT NULL, `price` int(11) NOT NULL, - `category` varchar(60) DEFAULT NULL, - PRIMARY KEY (`model`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `category` varchar(60) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- Dump dei dati della tabella es_extended.vehicles: ~240 rows (circa) +-- Dump dei dati della tabella es_extended.vehicles: ~241 rows (circa) INSERT INTO `vehicles` (`name`, `model`, `price`, `category`) VALUES ('Adder', 'adder', 900000, 'super'), ('Akuma', 'AKUMA', 7500, 'motorcycles'), @@ -1246,19 +1144,20 @@ INSERT INTO `vehicles` (`name`, `model`, `price`, `category`) VALUES ('Zion Cabrio', 'zion2', 45000, 'coupes'), ('Zombie', 'zombiea', 9500, 'motorcycles'), ('Zombie Luxuary', 'zombieb', 12000, 'motorcycles'), - ('Z-Type', 'ztype', 220000, 'sportsclassics'); + ('Z-Type', 'ztype', 220000, 'sportsclassics'), + ('Porsche 911 R', 'p911r', 190000, 'sports'); -- Dump della struttura di tabella es_extended.vehicle_categories CREATE TABLE IF NOT EXISTS `vehicle_categories` ( `name` varchar(60) NOT NULL, `label` varchar(60) NOT NULL, PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.vehicle_categories: ~11 rows (circa) INSERT INTO `vehicle_categories` (`name`, `label`) VALUES ('compacts', 'Compacts'), - ('coupes', 'Coupés'), + ('coupes', 'Coupés'), ('motorcycles', 'Motos'), ('muscle', 'Muscle'), ('offroad', 'Off Road'), @@ -1271,16 +1170,25 @@ INSERT INTO `vehicle_categories` (`name`, `label`) VALUES -- Dump della struttura di tabella es_extended.vehicle_sold CREATE TABLE IF NOT EXISTS `vehicle_sold` ( + `id` int(11) NOT NULL AUTO_INCREMENT, `client` varchar(50) NOT NULL, `model` varchar(50) NOT NULL, `plate` varchar(50) NOT NULL, `soldby` varchar(50) NOT NULL, `date` varchar(50) NOT NULL, - PRIMARY KEY (`plate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- Dump dei dati della tabella es_extended.vehicle_sold: ~0 rows (circa) +-- Dump della struttura di tabella es_extended.whitelist +CREATE TABLE IF NOT EXISTS `whitelist` ( + `identifier` varchar(46) NOT NULL, + PRIMARY KEY (`identifier`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; + +-- Dump dei dati della tabella es_extended.whitelist: ~0 rows (circa) + /*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; From b802b8a9ae1c5b58b22821b3175f29efeb2c6a27 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Fri, 1 Mar 2024 19:23:15 +0100 Subject: [PATCH 18/18] Delete async.lua --- .../es_extended/dependencies/async/async.lua | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 server-data/resources/[esx]/es_extended/dependencies/async/async.lua diff --git a/server-data/resources/[esx]/es_extended/dependencies/async/async.lua b/server-data/resources/[esx]/es_extended/dependencies/async/async.lua deleted file mode 100644 index cbfb6ab7c..000000000 --- a/server-data/resources/[esx]/es_extended/dependencies/async/async.lua +++ /dev/null @@ -1,71 +0,0 @@ -Async = {} - -function Async.parallel(tasks, cb) - if #tasks == 0 then - cb({}) - return - end - - local remaining = #tasks - local results = {} - - for i = 1, #tasks, 1 do - CreateThread(function() - tasks[i](function(result) - results[#results + 1] = result - - remaining = remaining - 1 - - if remaining == 0 then - cb(results) - end - end) - end) - end -end - -function Async.parallelLimit(tasks, limit, cb) - if #tasks == 0 then - cb({}) - return - end - - local remaining = #tasks - local running = 0 - local queue, results = {}, {} - - for i = 1, #tasks, 1 do - queue[#queue + 1] = tasks[i] - end - - local function processQueue() - if #queue == 0 then - return - end - - while running < limit and #queue > 0 do - local task = table.remove(queue, 1) - - running = running + 1 - - task(function(result) - results[#results + 1] = result - - remaining = remaining - 1 - running = running - 1 - - if remaining == 0 then - cb(results) - end - end) - end - - CreateThread(processQueue) - end - - processQueue() -end - -function Async.series(tasks, cb) - Async.parallelLimit(tasks, 1, cb) -end

[ESX] Menu Defualt